On Apr 30, 2009, at 10:55 AM, Daniel Kennett wrote:

Hi again,

Well, that was quick. With NSZombieEnabled, I get this when deallocating my context:

*** -[VetVisit_VetVisit_ _hasRetainedStoreResources]: message sent to deallocated instance 0x16b85600

VetVisit is class that represents an Entity in my object model - the Pet entity has a collection of VetVisit objects. I don't actually ever manage these directly - I let Core Data NSArrayControllers handle them. In this case, the model is never seeing any array controllers.

Is this something wrong with my model? I can't see anything wrong at surface level - indeed, the app itself has been working perfectly with its model for some time. I'd appreciate any pointers.

Does the "Pet" class, or any class it has a relationship with, release or autorelease any "VetVisit" object? I am assuming that the "Pet" entity has a relationship to "VetVisit"--do you have any code that would cause the relationship fault to fire? If so, what happens when you comment that out?

On 29 Apr 2009, at 16:32, Alexander Spohr wrote:

Daniel,

You are trying to fetch an object and keep it - but you want to ignore / throw away the NSManagedObjectContext. This will never work. The NSManagedObjectContext keeps the object. Your Pet can not exist without its NSManagedObjectContext.

You should let the caller provide a NSManagedObjectContext and fetch your Pet into that context. Make it the callers responsibility to get a NSManagedObjectContext not yours. + (Pet *)petAtURL:(NSURL *)url inContext:(NSManagedObjectContext *)aManagedObjectContext

Or copy the pet into something like an NSDictionary and return that.

        atze



Am 29.04.2009 um 10:59 schrieb Daniel Kennett:

Hi list,

I'm hoping you guys can help me. I'm loading up a Core Data store, copying some data out and attempting to clear it all up. I use this code for my Quicklook plugin, and in parts of my app for previewing documents in a more advanced manner than Quicklook provides.

This is how I set up my ManagedObjectContext:

+(Pet *)petAtURL:(NSURL *)url {
        
NSManagedObjectModel *managedObjectModel = [KNClarusQuickDocumentParser managedObjectModel]; NSPersistentStoreCoordinator *coordinator = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel] autorelease];
        
        [coordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                          configuration:nil
                                                                        URL:url
                                                                        
options:nil
                                                                         
error:&error];
        
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; // ^ Not Autoreleasing here. It's the responsibility of the caller to release the MOC. Autoreleasing causes crashes.

        [moc setPersistentStoreCoordinator:coordinator];
        [[moc undoManager] disableUndoRegistration];
        
        NSError *fetchError = nil;
        NSArray *fetchResults;
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
        
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet"
                                                                                
          inManagedObjectContext:moc];
        [fetchRequest setEntity:entity];
fetchResults = [moc executeFetchRequest:fetchRequest error:&fetchError];
        
if ((fetchResults != nil) && ([fetchResults count] == 1) && (fetchError == nil))
        {
                
                NSManagedObject *pet = [[fetchResults objectAtIndex:0] retain];
                return [pet autorelease];
        }
        
        return nil;
        
}


And this is how I get the data out and release it:

Pet *pet = [KNClarusQuickDocumentParser petAtURL:url];
        
// Copy out some data.

NSManagedObjectContext *context = [pet managedObjectContext];

if (context) {
                
                [context reset]; // This call results in EXC_BAD_ACCESS
                [context setPersistentStoreCoordinator:nil];
                [context release];
                
        }
        
return [dict autorelease];

-------- End code --------

Different combinations of trying to do this right result in crashes at different points. Leaving out [context reset] and just releasing it obviously gives EXC_BAD_ACCESS again. Autoreleasing the MOC in +petAtURL: causes crashes when the autorelease pool pops. The only way I can get it to not crash is to -init the MOC and never release or autorelease it, but that's causing memory leaks!

Is there a good example anywhere of how to set up and tear down a Core Data document correctly?

Thanks,

-- Daniel

_______________________

dan...@kennettnet.co.uk
http://www.kennettnet.co.uk

Please include previous messages in any reply you send.



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/atze%40freeport.de

This email sent to a...@freeport.de



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/cocoa-dev%40esoteritech.com

This email sent to cocoa-...@esoteritech.com



Keary Suska
Esoteritech, Inc.
"Demystifying technology for your home or business"

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to