[英]NSDocument - memory leak & app crash
我的基于文档的应用程序中发生内存泄漏。 它启动正常,我可以打开或制作一个新文档,但是只有一两次,然后该应用程序崩溃了。 我在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
方法的方法。
我不知道错误在哪里。当我关闭应用程序中的文档时,是否应该释放文档子类实例?
欢迎任何帮助。 谢谢。
作为一个疯狂的猜测,您是否实现了-[IVPMachine setDelegate:]
以保留委托? 如果是这样,请不要这样做。 代表应该是弱项,即不留任。 您拥有IVPMachine,因此,如果您拥有IVPMachine,则为循环所有权,这是使文档和IVPMachine都存活的原因。
实际上,请在“乐器”中进行更多挖掘。 它不仅可以告诉您泄漏了某些内容,还可以告诉您发生的所有保留和释放。 浏览该列表以查找未平衡的保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.