• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Crashing resetting or releasing an NSManagedObjectContext
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


References: 
 >Crashing resetting or releasing an NSManagedObjectContext (From: Daniel Kennett <email@hidden>)
 >Re: Crashing resetting or releasing an NSManagedObjectContext (From: Alexander Spohr <email@hidden>)
 >Re: Crashing resetting or releasing an NSManagedObjectContext (From: Daniel Kennett <email@hidden>)

  • Prev by Date: Re: Making sounds
  • Next by Date: Writable dir for non-admin user outside user's dir
  • Previous by thread: Re: Crashing resetting or releasing an NSManagedObjectContext
  • Next by thread: C language in obj-c
  • Index(es):
    • Date
    • Thread