iPhone - NSKeyedUnarchiver 内存泄漏
Posted
技术标签:
【中文标题】iPhone - NSKeyedUnarchiver 内存泄漏【英文标题】:IPhone - NSKeyedUnarchiver memory leak 【发布时间】:2009-09-03 13:13:27 【问题描述】:我正在使用NSKeyedUnarchiver unarchiveObjectWithFile:
读取应用程序数据。当使用 Leaks in Instruments 运行时,我被告知以下会产生泄漏:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *archivePath = [[NSString alloc]initWithFormat:@"%@/Config.archive", documentsDirectory];
//Following line produces memory leak
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
[archivePath release];
if( applicationConfig == nil )
applicationConfig = [[Config alloc]init];
else
[applicationConfig retain];
行:
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
正在产生 32 字节的内存泄漏。 applicationConfig 是一个实例变量。我的 initWithCode 函数只是做:
- (id)initWithCoder:(NSCoder *)coder
if( self = [super init] )
//NSMutableArray
accounts = [[coder decodeObjectForKey:@"Accounts"] retain];
//Int
activeAccount = [coder decodeIntForKey:@"ActiveAccount"];
return self;
知道为什么
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
正在产生泄漏吗?
【问题讨论】:
【参考方案1】:我的猜测是你的内存泄漏是由这行引起的:
[applicationConfig retain];
或这一行:
accounts = [[coder decodeObjectForKey:@"Accounts"] retain];
内存在unarchiveObjectWithFile:
中分配,但泄漏将由对象上的额外保留引起。确保您适当地释放applicationConfig
。
【讨论】:
我以为我读到我必须保留返回的对象,因为我自己没有分配它。你能解释一下吗? 是的,您必须保留它。因为你保留了它,你也必须在某个地方释放它。内存泄漏将是由于缺少释放造成的。 我在应用程序委托的 dealloc 方法中释放了 applicationConfig(所有这些代码都驻留在其中)。所以我仍然不明白报告的泄漏。它是否有可能认为会有泄漏,因为它没有以相同的方法看到匹配的版本?感谢您的帮助。 您还必须在applicationConfig
设置为任何其他值之前释放它。 accounts
成员变量也是如此。
啊哈!我找到了。我是一个白痴。我在仪器的堆栈跟踪中走得不够远。我假设因为它没有给我一些点击位置以从 NSKeyedUnarchiver 向下钻取,所以我不能再进一步了。 Account 是一个对象,有自己的 initWithCoder。最终调用了 SFHFKeychainUtils (使保存到钥匙链更容易),它给了我帐户的密码。对 SFHFKeychainUtils 的调用正在产生内存泄漏。感谢您的帮助。以上是关于iPhone - NSKeyedUnarchiver 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
在 iphone 5 和 iphone 6 中动态设置字体大小