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,我不认为这是一个问题,无论如何,无论如何都会释放该对象。我很欣赏第二只眼睛的建议。
答案 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。它们真的很有用。