Hi all,

Well it's solved, for now, but I have no idea how or why. I'll explain the 
steps taken as well as I can remember them, in the hopes that someone has seen 
something similar and can tell me what in the world just happened.

I needed to initialize a Core Data model on new document creation and followed 
the steps in Apple's "Departments" example, which explains how to override 
NSDocument's initWithType:error: method in my MyDocument class. The fine 
explanation is here:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/NSPersistentDocumentTutorial/04_Department/department.html#//apple_ref/doc/uid/TP40002832-SW1


In my last post, I stated that initWithType:error: was not being executed for 
new document creation. I came to this conclusion because of two things:

1. The model apparently wasn't being initialized and interface elements were 
not displaying the correct values or even operating correctly. For example, you 
could not type into a text field in the running application. That text field 
was supposed to be connected, through a NSObjectController, to a model object.

2. I placed breakpoints in initWithType:error: and execution did not stop 
there. The breakpoint arrows turned yellow (as opposed to blue) in the Xcode 
gutter. Somewhere I heard that this happens when the code has not been loaded 
into memory, hence the breakpoint cannot be resolved. I don't know why this 
should be the case since the document window did appear and hence its 
controller class must have been loaded.

I checked my build configuration and was running Debug, not Release.

I checked the compiler flags related to debug information. Although I don't 
believe there was a problem with my earlier settings, I changed the following:

- Debug Information was stabs; I changed it to DWARF with dSym file.
- Level of Debug Info was default; I changed it to All Symbols (which sets 
-fno-eliminate-unused-debug-symbols.
- I set optimization to None (-O0) as opposed to -Os. Yes, I know it should be 
-Os but that does bizarre things like statement reordering and elimination.

I even cleaned all targets and re-ran. But none of this seemed to make any 
difference.

To test my sanity, I created a new NSPersistentDocument-based Core Data 
project, copied the model file over, copied a few methods, such as 
initWithType:error:, into the generated MyDocument class implementation, copied 
over my custom NSView subclass, threw that and an object controller into a xib 
file, drew some connections, and ran it. It *did* execute initWithType:error:. 
But my original project didn't.

This was strange indeed.

I did a bunch of things at that point (not necessarily in this order): closed 
and re-opened Xcode, cleaned and rebuilt all targets a few times, put some 
NSLog calls in the methods that didn't appear to execute, and probably a few 
other things I can't remember, and somehow, mysteriously, it began to work. It 
stops at the breakpoints now, though sometimes they're blue and sometimes 
they're yellow. I can't explain any of this. If someone can, please enlighten 
me!

Thanks,
Soong



----- Original Message ----
From: Oftenwrong Soong <[email protected]>
To: [email protected]
Sent: Fri, November 20, 2009 12:04:06 PM
Subject: CoreData/NSPersistentDocument initialization

Hi all,

My document model is Core Data based. When a new document is created, I must 
initialize the model to contain several objects with default values.

I followed Apple's "Departments" example:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/NSPersistentDocumentTutorial/04_Department/department.html#//apple_ref/doc/uid/TP40002832-SW1

At that page, it explains how to create a new Department object when a new 
document is created. It does so by implementing -(id)initWithType:error: in the 
MyDocument class, which is a NSPersistentDocument subclass, just like my own 
app's document class.

However, initWithType:error is never called for new document creation (or any 
document creation for that matter). I placed a breakpoint inside the method and 
execution does not pause there. Instead, -(id)init gets called. This is a 
problem because -(id)init is called when documents are opened as well as 
created from scratch.

My questions are:
1. Have I overlooked something?
2. Is there a better way to initialize new Core Data models to a known state? 
(Yes, I know I can create a whole model in code, a la the Core Data Utility 
example, but I mean when using NSPersistentDocument.)

Thanks,
Soong


      
_______________________________________________

Cocoa-dev mailing list ([email protected])

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 [email protected]

Reply via email to