2011-12-22 43 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