使用NSKeyedUnarchiver decodeObjectForKey解码NSArray时出现内存泄漏

时间:2011-07-12 14:11:48

标签: objective-c memory-leaks nsarray nskeyedarchiver

我正在尝试修复一个方法中某处导致的巨大内存泄漏,它从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对象。

提前致谢

编辑: - (CustomObject *)getCustomObject经常被调用,因此这个泄漏的影响非常大。

1 个答案:

答案 0 :(得分:2)

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

这就是说你正在将myArray传递给那些没有正确释放它的东西。您是否在customObjects dealloc中正确发布了数组?