• 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: Crash as NSPersistentDocument creates its persistence stack
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Crash as NSPersistentDocument creates its persistence stack


  • Subject: Re: Crash as NSPersistentDocument creates its persistence stack
  • From: Jerry Krinock <email@hidden>
  • Date: Thu, 25 Dec 2008 22:55:57 -0800

On 2008 Dec, 24, at 0:03, mmalc Crawford wrote:

<http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSPersistentDocument_Class/Reference/Reference.html#//apple_ref/doc/uid/TP30001179-CJBJBIHA >


Thank you, mmalc. Indeed it was explained further down in the documentation you noted.

I believe the problem is my triggering some kind of bug in the way Xcode handles multiple/versioned data models.

My project included two xcdatamodel files. One was versioned and one was not. The problem apparently occurred when I wanted to consolidate them into one. Hoping to avoid re-typing all the attributes, using Xcode's GUI data model editor, I copied the single entity which was in the non-versioned xcdatamodel to the clipboard and pasted it into the versioned xcdatamodel, saved it, and deleted the non-versioned xcdatamodel. Everyone looked happy.

Except, when the project built, a very strange thing would happen. In Contents/Resources there would be a folder named Bkmm.momd containing an item named BmxBk 2.mom. Bkmm was the name of the non-versioned xcdatamodel which I had deleted. BmxBk 2 was version 2 of the consolidated xcdatamodel which remained.

Then when the project ran, my persistent document initialized itself with an invalid managed object model. I proved that by gutting my NSPersistentDocument subclass and replacing it with a Bonehead implementation [1] that simply logs each object in the persistence stack when the user creates a new document. The console output [2] shows that the moc and the psc are OK, but the mom is invalid.

First, I tried adding another valid data model containing a simple entity with one attribute to the project. Still same crash.

Then, I removed the screwed-up data model from the project and re- added it. Now, it even showed up in wrong in Xcode's Groups & Files, with the BmxBk.xcdatamodel contained in a "folder" named after the deleted Bkmm.xcdatamodel...

PNG image



If I deleted all xcdatamodels from the project, then it would build run and log the whole persistence stack without crashing. Of course, the model's entities logged as an empty dictionary.

Finally, I created a new Cocoa Core Data Document-Based application project from scratch, replaced the data model provided by the Xcode template with a copy of my consolidated xcdatamodel, and added the iniWithType:error: implementation from my Bonehead implementation to the template's MyDocument. Building and running this project logs my entire managed object model as expected; no crash.

So, tomorrow I'm going to copy all of my old files to the new project and I expect that it will work again. Oh well, the project was in need of a renaming and a housecleaning anyhow.

Unless someone sees otherwise, I'll strip down my old project someday and file a bug regarding Xcode.

Jerry


[1] Bonehead implementation of an NSPersistentDocument subclass

@interface BmxBk : NSPersistentDocument {
}

@implementation BmxBk

- (id)initWithType:(NSString *)type error:(NSError **)error_ {
self = [super initWithType:type
error:error_];
if (self) {
// All of the code in this method executes OK if I paste it into
// -[MyDocument initWithType:error] of the DepartmentsAndEmployees
// Apple Sample Code.


// The usleeps are because the NSLogs sometimes appear after the later
// gdb startup in the console log, obscuring what triggered the crash.


        // Do we have a valid doc type?
        NSLog(@"doc type = %@", type) ;

        // Do we have a valid moc?
        NSManagedObjectContext* moc = [self managedObjectContext] ;
        NSLog(@"moc = %@", moc) ;
        NSLog(@"Will sleep 5") ;
        usleep (5000000) ;

// Do we have a valid psc?
NSPersistentStoreCoordinator* psc = [moc persistentStoreCoordinator] ;
NSLog(@"psc = %@", psc) ;
NSLog(@"Will sleep another 5") ;
usleep (5000000) ;


// Do we have a valid mom?
NSManagedObjectModel* mom = [psc managedObjectModel] ;
NSLog(@"mom = %@", mom) ; // <-- Crash or log something not a mom.
NSLog(@"Will sleep a third 5") ;
usleep (5000000) ;


        // Can we see the entities in our mom?
        NSDictionary* entities = [mom entitiesByName] ;
        NSLog(@"entities = %@", entities) ;
        NSLog(@"Will sleep a fourth 5") ;
        usleep (5000000) ;
    }
    return self ;
}

@end

[2] Console output produced by [1]

• User clicks in menu File > New. Note that mom is not a mom.
MyApp[24942:10b] doc type = MyApp Document
MyApp[24942:10b] moc = <NSManagedObjectContext: 0x15b19b40>
MyApp[24942:10b] psc = <NSPersistentStoreCoordinator: 0x15b15cb0>
MyApp[24942:10b] mom = <NSKeyValueUndefinedSetter: 0x15b168b0>
MyApp[24942:10b] *** -[NSKeyValueUndefinedSetter entitiesByName]: unrecognized selector sent to instance 0x15b168b0
MyApp[24942:10b] *** -[NSKeyValueUndefinedSetter entitiesByName]: unrecognized selector sent to instance 0x15b168b0
• User clicks in menu File > New again. This time, mom is just invalid.
MyApp[24942:10b] doc type = MyApp Document
MyApp[24942:10b] moc = <NSManagedObjectContext: 0x2e5290>
MyApp[24942:10b] psc = <NSPersistentStoreCoordinator: 0x2f1780>


[Session started at 2008-12-25 18:43:28 -0800.]
Loading program into debugger…
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)


_______________________________________________

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: 
 >Crash as NSPersistentDocument creates its persistence stack (From: Jerry Krinock <email@hidden>)
 >Re: Crash as NSPersistentDocument creates its persistence stack (From: mmalc Crawford <email@hidden>)

  • Prev by Date: Re: Memory Management question
  • Next by Date: shareware licensing, aquatic prime?
  • Previous by thread: Re: Crash as NSPersistentDocument creates its persistence stack
  • Next by thread: re: Crash as NSPersistentDocument creates its persistence stack
  • Index(es):
    • Date
    • Thread