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 中动态设置字体大小

Surface Pro4链接不上iphone手机的热点

iphone13和12外观的区别 iphone13和iphone12对比哪个好

为 iPhone 和 iPhone 4 开发之间有啥变化?

iPhone 5 与 iPhone 4 的图像命名