NSMutableArray内存泄漏

时间:2011-08-29 15:13:09

标签: objective-c

XCode报告了特定代码行的内存泄漏:

(NSArray*)myFunction{
   NSMutableArray * tempMapListings=[[NSMutableArray alloc] init]; //Xcode says leak is here

   //do a bunch of stuff to insert objects into this mutable array


    return tempMapListings;
    [tempMapListings release]; // but I release it ?!

   }

这是因为作为NSArray发布了一个可变数组吗?由于mutable继承自inmutable,我不认为这是一个问题,无论如何,无论如何都会释放该对象。我很欣赏第二只眼睛的建议。

2 个答案:

答案 0 :(得分:5)

不,你没有发布它。 return语句实际上结束了该方法的执行。所以,它下面的一行,在你的情况下

[tempMapListings release]; // but I release it ?!

未执行

相反,您使用autorelease

-(NSArray*)myFunction{
    NSMutableArray * tempMapListings=[[NSMutableArray alloc] init];
    //do a bunch of stuff to insert objects into this mutable array
    return [tempMapListings autorelease];
}

您可以在许多地方了解autorelease。在Apple自己的文档中查找它;你也可以谷歌吧。

答案 1 :(得分:3)

在从函数返回后,您将发布tempMapListings 。在return语句之后,不再在该分支上执行代码。因此,您的[tempListListings release]声明永远不会运行。而且,当你返回它时,你实际上并不想立即释放它 - 调用者永远不会有机会保留数组!

Autorelease pool是你的朋友。添加到自动释放池的对象将“代表”最终“释放”,从而使调用者有时间获取结果。要将对象添加到默认池,请将分配行更改为

NSMutableArray *tempMapListings = [[[NSMutableArray alloc] init] autorelease];

并删除最后release次来电。

有关自动释放池的更多信息,请阅读Apple's documentation。它们真的很有用。