gpt4 book ai didi

objective-c - NSDocument - 内存泄漏和应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 18:00:14 26 4
gpt4 key购买 nike

我的基于文档的应用程序存在内存泄漏。它启动正常,我可以打开或创建新文档,但只能打开一两次,然后应用程序崩溃。我在 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 属性的声明如下:machine ivar 和 IVPMachine 上的 @property(readonly) IVPMachine *machine; 类符合 NSCoding 协议(protocol)。如果是新文档,我已覆盖 -(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。

我无法弄清楚错误所在。当我关闭应用程序中的文档时,我的文档子类实例不是应该被释放吗?

欢迎任何帮助。谢谢。

最佳答案

大胆猜测,您是否实现了 -[IVPMachine setDelegate:] 来保留委托(delegate)?如果是这样,请不要这样做。代表应该是弱引用,即非保留的。您拥有 IVPMachine,因此如果它重新拥有您,那就是循环所有权,并且是保持文档和 IVPMachine 存活的原因。

更实际的是,在 Instruments 中挖掘更多内容。它不仅可以告诉您泄漏了某些内容,还可以告诉您发生的每一次保留和释放。查看该列表以查找未平衡的保留。

关于objective-c - NSDocument - 内存泄漏和应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7615675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com