Crashing resetting or releasing an NSManagedObjectContext
Crashing resetting or releasing an NSManagedObjectContext
- Subject: Crashing resetting or releasing an NSManagedObjectContext
- From: Daniel Kennett <email@hidden>
- Date: Wed, 29 Apr 2009 09:59:04 +0100
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
_______________________
email@hidden
http://www.kennettnet.co.uk
Please include previous messages in any reply you send.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden