| |||
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] |
I'm having troubles with some NSDocument code that I, a Cocoa newbie, wrote. I'm trying to preserve an NSFileWrapper passed by loadFileWrapperRepresentation:ofType: within the NSDocument. If I create a new file, I can save it, even multiple times, and all's well and good. However, when I load a file from disk and try to save it again, my application crashes.I would remove all these unused variables. Especially that NSString **error [is ** even valid in ObjC? I've never seen a double-dereference in any sample code before]
If I comment out my "wrapper = newWrapper" line in loadFileWrapperRepresentation, the application runs and saves, albeit without loading any of the data. This looks eerily like a simple retain problem, but if it is, my newbie eye certainly can't find it.
I sliced the detailed pieces for loading and saving out of the routines. What's left is enough to cause the crashing behavior when saving files, which actually occurs after the loading/saving is complete during the event loop, not anywhere that's easily debuggable.
~ Chris Erbach
// From CocoaDream.h:
@interface CocoaDream : NSDocument
{
NSFileWrapper * wrapper;
IBOutlet NSTextView * entryBody;
IBOutlet NSFormCell * subjectBox;
IBOutlet NSFormCell * dateBox;
}
// From CocoaDream.m:
- (BOOL)loadFileWrapperRepresentation:(NSFileWrapper *)newWrapper ofType:(NSString *)type {
NSEnumerator * fileEnum;
id curFile;
NSMutableDictionary * metadata;
NSString ** error = nil;
[newWrapper retain];Use [NSDictionary dictionary]. This will then be in the autorelease pool. At least, I think I am right: I don't think YOU should be retaining the dictionary, the the USER (NSFileWrapper) should be doing that.
[wrapper release]; // Useless, logically, conventionally, valuable
wrapper = newWrapper; // Commenting this line prevents the crashes
return true;
}
- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
[super windowControllerDidLoadNib:aController];
[wrapper release];
if (wrapper == nil) {
// Only used if we haven't loaded a wrapper, earlier, from loadFileWrapperRepresentation yet
wrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[[NSDictionary alloc] init]];
}More unused variables can go. Especially the metaData, for which you create and (implicitly) retain a dictionary for, but which is never used, nor released. And there's another **.
}
- (NSFileWrapper *)fileWrapperRepresentationOfType:(NSString *)type {
NSMutableDictionary * metaData = [[NSMutableDictionary alloc] init];
NSData * htmlData = nil;
NSString ** error = nil;
_______________________________________________
return wrapper;
}
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.
| References: | |
| >NSDocument/NSFileWrapper troubles (From: Christopher Erbach <email@hidden>) |
| Home | Archives | FAQ | Terms/Conditions | Contact | RSS | Lists | About |
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE
Contact Apple | Terms of Use | Privacy Policy
Copyright © 2007 Apple Inc. All rights reserved.