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/archive%40mail-archive.com

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

Reply via email to