2011-12-22 41 views
0

我宣布这样的特性:分配给属性的NSMutableArray的正确内存处理?

@property (nonatomic, retain) NSMutableArray *pricingLevels; 

我给它分配是这样的:

self.pricingLevels = [[[NSMutableArray alloc] init]; 
在我的dealloc

我有这样的:

self.pricinglevels=nil; 

当我分析我的代码与xCode它说我在这里有一个内存泄漏:

self.pricingLevels = [[[NSMutableArray alloc] init]; 

对此我是否应该使用autolrelease,因为self.pricinglevels也保存对数组的引用?

+0

这回答你的问题。 http://stackoverflow.com/questions/6055274/use-autorelease-when-setting-a-retain-property-using-dot-syntax – 2011-12-22 14:16:21

回答

2

self.pricingLevels是一个属性,声明为retained这意味着每次通过属性分配(点语法或方法)设置它时,对象都会自动为您保留该对象。

self.pricingLevels = [NSMutableArray array]; 
[self setPricingLevels:[NSMutableArray array]]; 

上述代码将执行相同的操作并自动保留传递的数组。这是在引擎盖下(或类似的)发生的事情。这种方法被称为:

- (void)setPricingLevels:(NSMutableArray *)a { 
    if(_pricingLevels != a) { 
     [_pricingLevels release]; 
     _pricingLevels = [a retain]; 
    } 
} 

你看?自动保留,而以前的值自动释放。

编辑回答你的最后一个问题是的,你应该叫autorelease

+0

感谢您的洞察,这篇文章也有一个很好的更长的解释: http:///blog.thepete.net/2010/10/common-objective-c-memory-management.html – Slee 2011-12-22 14:32:28

0

是的,你有内存泄漏。为保留属性分配self.propertyName会自动执行保留。您可能需要在分配后释放对象(在分配使用autorelease之后稍微高效一些,以便执行release),或者您需要将保留对象分配给实例字段(无self.),而不是属性名称AND,对于后者的情况下,您需要确保实例字段先前为零(即,仅在初始化逻辑中进行直接分配)。

(不要忘记你的dealloc方法。)

(这一切都无关的对象恰好是一个NSMutableArray的事实。)

0

问题是 同时初始化和释放你不应该使用自盈的变量

self.pricingLevels = [[[NSMutableArray alloc] init]; 
//instead it should be 

pricingLevels = [[[NSMutableArray alloc] init]; 

即使在释放它应该是

[pricingLevels release]; 
pricingLevels = nil; 
+0

@Slee你可以在上面的代码中试试这个,让我知道它是否解决了你的问题 – Nakkeeran 2011-12-22 14:58:32