的NSMutableArray存储器泄漏
问题描述:
Xcode是报告上的代码中的特定行中的内存泄漏:的NSMutableArray存储器泄漏
(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从无法继承,我不认为这是一个问题,并且无论如何,该对象被释放。我会很感激第二只眼睛的建议。
答
您正在发布tempMapListings
之后您从函数返回。在返回语句之后,在该分支上不再执行任何代码。 Ergo,你的[tempListListings release]
声明永远不会运行。而且,当你回来的时候,你并不想马上释放它 - 呼叫者永远不会有机会保留这个数组!
Autorelease池是你的朋友在这里。添加到自动释放池的对象最终会以您的名义发布,让您的呼叫者有时间获取结果。为了您的对象添加到默认池,你的配置行更改为
NSMutableArray *tempMapListings = [[[NSMutableArray alloc] init] autorelease];
,并删除最后release
电话。
有关autorelease池的更多信息,请阅读Apple's documentation。他们真的很有用。
+0
谢谢!我知道这将是明显的。 – johnbakers
答
不,你不释放它。 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自己的文档中查找它;你也可以谷歌它。
“这是因为NSArray是一个可变数组吗?” - 你是什么意思?问题不在这里,而是与该功能有关。你可以发布所有使用该功能的代码吗?你能不能准确地展示你对这个阵列做了什么? – darksky