【发布时间】:2011-09-30 20:21:31
【问题描述】:
我的基于文档的应用程序出现内存泄漏。它启动正常,我可以打开或制作新文档,但只有一两次,然后应用程序崩溃。 我在 Xcode 中使用了分析工具,没有问题。
但是,Instruments 揭示了内存泄漏,但我找不到它在我的代码中的位置。
使用对象分配,当我关闭文档时,我可以看到我的 NSDocument 子类没有释放......我真的不知道这是否是预期的行为。
这是我阅读和编写文档的方式:
-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
NSMutableData *d = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:d];
[archiver encodeObject:[self machine]
forKey:IVPCodingKeyMachine];
[archiver finishEncoding];
[archiver release];
if(outError) {
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:unimpErr
userInfo:NULL];
}
return d;
}
-(BOOL)readFromData:(NSData *)data
ofType:(NSString *)typeName
error:(NSError **)outErro {
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
machine = [[unarchiver decodeObjectForKey:IVPCodingKeyMachine] retain];
[machine setDelegate:self];
[unarchiver finishDecoding];
[unarchiver release];
if(outError) {
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain
code:unimpErr
userInfo:NULL];
}
return YES;
}
machine 属性声明如下:@property(readonly) IVPMachine *machine; 上的 machine ivar 和 IVPMachine 类符合 NSCoding 协议。如果有新文档,我已经覆盖了-(id)initWithType:(NSString *)typeName error:(NSError **)outError; 方法,这里是我使用的代码:
-(id)initWithType:(NSString *)typeName error:(NSError **)outError {
self = [super initWithType:typeName error:outError];
if (self) {
machine = [[IVPMachine alloc] initWithCreditAmount:2000];
[machine setDelegate:self];
[machine setGame:[[IVPGamesLibrary sharedInstance]
objectInGamesAtIndex:0]];
}
return self;
}
最后在-(void)dealloc; 方法中我发布了machine ivar。
我不知道错误出在哪里。当我关闭应用程序中的文档时,我的文档子类实例不应该被释放吗?
欢迎任何帮助。谢谢。
【问题讨论】:
-
您从 I/O 方法返回的错误是错误的。您显然已经实现了它们,因此返回
unimpErr是没有意义的。你应该返回一些更接近真相的东西; FoundationErrors.h 是一个不错的起点(请注意,这些错误位于NSCocoaErrorDomain中)。
标签: objective-c macos cocoa memory-leaks nsdocument