【问题标题】:memory leak when decoding a NSArray with NSKeyedUnarchiver decodeObjectForKey使用 NSKeyedUnarchiver decodeObjectForKey 解码 NSArray 时的内存泄漏
【发布时间】:2011-07-12 14:11:48
【问题描述】:

我正在尝试修复一个方法中某处造成的巨大内存泄漏,该方法从 CoreData 数据存储中获取 NSData 对象并将该 NSData 解压缩回 NSArray。

- (CustomObject *) getCustomObject
{
.... get myManagedObject from CoreData Store

    CustomObject *customObject = nil;
    if(myManagedObject)
    {
        customObject = [[[CustomObject alloc] init] autorelease];

        NSData *arrayData = [myManagedObject valueForKey:@"resultArray"];

        /* read and save resultArray */
        NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:arrayData];

        /* per definition decodeObjectForKey returns an autoreleased object */
        /* Instruments (The Profiler) points out this line for the source */
        /* of the memory leak. */
        NSArray *myArray = [unArchiver decodeObjectForKey:@"rArray"];

        /* myArray is a (nonatomic,retain) property in CustomObject */
        [customObject setMyArray:myArray];

        /* finishDecoding and release unarchiver */
        [unArchiver finishDecoding];
        [unArchiver release];
    }

    return customObject;
}

如果我释放 myArray(我不应该这样做,因为它是一个自动释放的对象),内存泄漏就会消失。

有谁知道如何解决这个问题? CustomObject 的 NSArray 中的项目是 NSDictionary 对象。

提前致谢

edit: - (CustomObject *) getCustomObject 经常被调用,所以这次泄露的影响是相当大的。

【问题讨论】:

  • 您需要开始跟踪[customObject setMyArray:myArray]; 的路径确保您在customObject dealloc 方法中正确释放myArray,如果它不存在,请检查可能保留数组的其他任何地方。
  • 一个void方法不能返回值!

标签: objective-c memory-leaks nsarray nskeyedarchiver


【解决方案1】:

如果您是从 Instruments 中找到的 - 它显示的是创建泄漏对象的位置,而不是泄漏对象的位置。

这就是说您将 myArray 传递给未正确释放它的东西。您是否在 customObjects dealloc 中正确释放了数组?

【讨论】:

  • 好的,抱歉,这是一连串的问题,现在已经解决了。我在 CustomObject dealloc 中注释掉了 myArray 的释放,因为它在那里崩溃了。但崩溃与其他方面的不平衡释放有关。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2011-11-02
  • 2016-02-15
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多