Re: Crashing resetting or releasing an NSManagedObjectContext
Re: Crashing resetting or releasing an NSManagedObjectContext
- Subject: Re: Crashing resetting or releasing an NSManagedObjectContext
- From: Keary Suska <email@hidden>
- Date: Thu, 30 Apr 2009 16:51:55 -0600
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
_______________________
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
_______________________________________________
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
Keary Suska
Esoteritech, Inc.
"Demystifying technology for your home or business"
_______________________________________________
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