On Oct 29, 2009, at 16:55 , Sean McBride wrote: > On 10/22/09 4:59 PM, Melissa J. Turner said: > >>> I have an entity 'Scene' with a to-many relationship to an entity >>> 'Target'. The inverse relationship is also to-many. Both relationships >>> are optional and the delete rule for both sides is nullify. >>> >>> To repro, I delete all Scenes then try to save. It gives: >>> >>> "Dangling reference to an invalid object." = <null>; >>> NSAffectedObjectsErrorKey = ( >>> <BSScene: 0x2004ff940> (entity: Scene; id: 0x2004f32a0 <x-coredata:// >>> FCE3E0E3-F187-4C44-BFC3-60D7AF3E579F/Scene/p343> ; ... >>> >>> This error gives only 4 hits with Google. :( >>> >>> The problem is that some Targets still have relationships to some >>> Scenes! How can that happen? It seems like the delete rule is not >>> doing its job. >> >> Does the object with the ID <x-coredata://FCE3E0E3-F187-4C44- >> BFC3-60D7AF3E579F/Scene/p343> exist in the affected store? What happens >> when you call existingObjectWithID:error:? >> >> Do you know what version of the OS the bad documents were created on? A >> lot changed in the relationship handling area in 10.6 (for the better, >> really and truly ;-), so knowing whether your customers created them on >> 10.5.x or 10.6.x would help narrow down the possibilities. > > Thanks Melissa and Ben for your replies! > > I have been working on this issue for days now and am getting > increasingly confused. :) > > My coworker found a way to create a document (in 10.6.1) with almost the > same problem as originally described (it complains about the inverse > relationship instead). > > Examination of the XML document (as text) suggests that the object graph > is ok. > > To repro: 1) open said document 2) delete a particular managed object 3) > attempt to save -> receive "dangling reference" error. Repros 100%. > > I've also found that changing a particular line of my code prevents > (100%) the error from occurring. Said line only runs when the document > is opened (as a result of a controller getting a KVO notification). > > The entities in question are Scene and Target. Scene has a to-many > 'targetsWeak' relationship. Target has a to-many 'scenesWeak' > relationship. They are inverses. They are optional and nullify. > > The code snippet in question: > > NSSet* currentTargets = [scene targetsWeak]; > NSSet* additionallyDesiredTargets = <some fetch result>; > BOOL isEqual = [currentTargets isEqualToSet: > additionallyDesiredTargets]; > assert (isEqual); > //if (!equal) > { > [scene addTargetsWeak:additionallyDesiredTargets]; > } > > It turns out that isEqual is always YES in this limited repro case. > Therefore, I don't really need to change 'targetsWeak' (the 'if' body). > But if I do anyway (the commented 'if'), I get the 'dangling reference' > error. If I don't, I don't. > > Even if I do [scene addTargetsWeak:[scene targetsWeak]] I get the error. > > Does this make any sense to anyone?
The only caveat is you cannot change relationships from within -awakeFromFetch. This is documented: <http://developer.apple.com/mac/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/instm/NSManagedObject/awakeFromFetch> Otherwise, if this repros 100% of the time, file a bug and we'll take a look at it. - Ben _______________________________________________ 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