Hi Jerry, I am facing the exact same crash as you in my NSPersistentDocument app.
When a user has an already saved document opened, if he chooses "Duplicate" and then changes the name OR from his saved document, if he chooses "Save As", he will probably crash the application later when there is a call to "willChangeValueForKey:" on one of the managed object. I did not find a way to reproduce in a small project yet. I am going to try your workaround. Here is the crash : Exception Type: SIGSEGV Exception Codes: SEGV_MAPERR at 0x60 Crashed Thread: 0 Thread 0 Crashed: 0 CoreData 0x7fff862cab00 __propertyAtIndexForEntityDescription + 16 1 CoreData 0x7fff862c920d _snapshot_get_value_as_object + 237 2 CoreData 0x7fff862d4b18 -[NSManagedObject(_NSInternalMethods) _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 312 3 libobjc.A.dylib 0x7fff86652080 _cache_getImp + 192 4 CoreData 0x7fff862d49ca -[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__] + 90 5 CoreData 0x7fff862d48b8 -[NSManagedObjectContext(_NSInternalChangeProcessing) _establishEventSnapshotsForObject:] + 56 6 libobjc.A.dylib 0x7fff86652080 _cache_getImp + 192 7 CoreData 0x7fff862d47be __PFFastMOCObjectWillChange + 190 8 CoreData 0x7fff862d1599 __PF_ManagedObject_WillChangeValueForKeyIndex + 249 9 CoreData 0x7fff862d1465 -[NSManagedObject willChangeValueForKey:] + 101 Best Regards. Romain Piveteau. Le 7 mars 2014 à 17:30, Jerry Krinock <je...@ieee.org> a écrit : > This message regards my SQLite NSPersistentDocument-based app, which has > adopted Auto Save and Versions but not Asynchronous Saving, legacy > delete/rollback SQLite journaling, built with OS X 10.9 SDK, manual memory > management. Its document data model has a singular “document options” > object, which has a couple dozen attributes including about six date > attributes and one relationship. > > Steps to reproduce: > > • Click in the menu: File > Duplicate. As expected, new document window pops > out of the old, and filename in the title bar has keyboard focus. > • Type in a new name. > • End editing. > • Execute code which attempts to get any of those date attributes, or that > relationship, or set any attribute. > > Result: EXC_BAD_ACCESS. (See CALL STACK below.) Getting a string or number > attribute works OK. The singular object is neither faulted nor deleted. Its > -retainCount is 14. I’m calling it “gutted”. Poking with the debugger, I > saw indications that other objects in the store might be “gutted" too. > > Running the same build in OS X 10.8 works fine. > > Can anyone explain technically this “gutted” state? > > I think this is probably another bug in NSPersistentDocument. It might be > another facet of the bugs in which the store options to request legacy > delete/rollback journaling are not being passed up the stack in > non-lightweight migration (Apple Bug 15854533) or File > Duplicate (Apple Bug > 16038419). (We fixed those with a method swizzle in > NSPersistentStoreCoordinator.) > > I know about the open-source BSManagedDocument as a replacement for > NSPersistentDocument. If this app were not so big and old, I would replace > NSPersistentDocument with BSManagedDocument. I will certainly start my next > app with BSManagedDocument. > > A workaround is to immediately close and re-open the document and window > after such a duplicate-and-rename. Out of the box, NSPersistentDocument does > this during a Revert operation, unlike NSDocument which simply refreshes the > existing document and window. So it is not surprising that the same behavior > is necessary for reliable operation after a duplicate-and-rename. You can > detect the duplicate-and-rename by overriding -[NSDocument > saveToURL:ofType:forSaveOperation:completionHandler:] and testing for the > existing -fileURL to be nil, prior to invoking super. In all other > operations I have tested, it is not nil. I tested the following operations: > > File > Open > File > New > File > Save As > File > Move To > File > Rename > File > Revert to > Last Saved > File > Revert to > Browse All Versions, restore old version > File > Revert to > Browse All Versions, just click “Done" > > So I’m getting ready to ship an update with this workaround. I hope I didn’t > miss any corner cases. > > Thanks for reading, > > Jerry > > CALL STACK (Attempt to set a BOOL attribute of gutted object) > > EXC_BAD_ACCESS (code=1, address=0x60) > Thread 0 Crashed:: Dispatch queue: com.apple.main-thread > 0 com.apple.CoreData _propertyAtIndexForEntityDescription + 16 > 1 com.apple.CoreData snapshot_get_value_as_object + 237 > 2 com.apple.CoreData -[NSManagedObject(_NSInternalMethods) > _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 312 > 3 com.apple.CoreData -[NSManagedObject(_NSInternalMethods) > _newAllPropertiesWithRelationshipFaultsIntact__] + 90 > 4 com.apple.CoreData -[NSManagedObjectContext(_NSInternalChangeProcessing) > _establishEventSnapshotsForObject:] + 56 > 5 com.apple.CoreData _PFFastMOCObjectWillChange + 190 > 6 com.apple.CoreData _PF_ManagedObject_WillChangeValueForKeyIndex + 249 > 7 com.apple.CoreData -[NSManagedObject willChangeValueForKey:] + 101 > 8 com.mycompany.myframework 0x000000010002490c -[Bookshig > setIgnoreDisparateDupes:] + 64 (DocOptions.m:233) > 9 com.apple.CoreData _PF_Handler_Public_SetProperty + 68 > 10 com.apple.Foundation 0x00007fff863991d4 > -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 343 > 11 com.apple.AppKit -[NSObjectController _setSingleValue:forKeyPath:] + > 105 > 12 com.apple.Foundation 0x00007fff8639919a > -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 285 > 13 com.apple.AppKit -[NSBinder > _setValue:forKeyPath:ofObject:mode:validateImmediately:raisesForNotApplicableKeys:error:] > + 364 > 14 com.apple.AppKit -[NSBinder setValue:forBinding:error:] + 245 > 15 com.apple.AppKit -[NSValueBinder > _applyObjectValue:forBinding:canRecoverFromErrors:handleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:] > + 194 > 16 com.apple.AppKit -[NSValueBinder > applyDisplayedValueHandleErrors:typeOfAlert:canRecoverFromErrors:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:error:] > + 621 > 17 com.apple.AppKit -[NSValueBinder performAction:] + 288 > 18 com.apple.AppKit -[_NSBindingAdaptor > _objectDidTriggerAction:bindingAdaptor:] + 133 > 19 com.apple.AppKit -[NSControl sendAction:to:] + 56 > 20 com.apple.AppKit -[NSCell _sendActionFrom:] + 128 > 21 com.apple.AppKit -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + > 2316 > 22 com.apple.AppKit -[NSButtonCell > trackMouse:inRect:ofView:untilMouseUp:] + 487 > 23 com.apple.AppKit -[NSControl mouseDown:] + 706 > 24 com.apple.AppKit -[NSWindow sendEvent:] + 11296 > 25 com.mycompany.myframework 0x00000001000a8e13 -[SSYWindow > sendEvent:] + 71 (SSYWindow.m:10) > 26 com.apple.AppKit -[NSApplication sendEvent:] + 2021 > 27 com.apple.AppKit -[NSApplication run] + 646 > 28 com.apple.AppKit NSApplicationMain + 940 > > > _______________________________________________ > > 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: > https://lists.apple.com/mailman/options/cocoa-dev/feedback%40rhapsoft.com > > This email sent to feedb...@rhapsoft.com _______________________________________________ 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com