的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从无法继承,我不认为这是一个问题,并且无论如何,该对象被释放。我会很感激第二只眼睛的建议。

+2

“这是因为NSArray是一个可变数组吗?” - 你是什么意思?问题不在这里,而是与该功能有关。你可以发布所有使用该功能的代码吗?你能不能准确地展示你对这个阵列做了什么? – darksky

您正在发布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自己的文档中查找它;你也可以谷歌它。