2012-02-15 80 views
0

的我有一個的NSMutableArray中的AppDelegate 我使用的財產(非原子,保留) 和didfinishlaunch再次合成它關於使用非原子,留住產權

使用分配它[NSMutableArray裏的alloc]初始化];

所以,我的疑問是,如果我使用版本方法在deallloc中發佈它。 是否正確發佈? 或仍然保留計數在那裏。 如果我做錯了,請提供適當的解決方案。

+4

如果這是一個新項目,請打開ARC。 – bbum 2012-02-15 06:44:27

回答

4

這取決於你是如何分配的。如果你的任務是直接向伊娃,像

myProperty = [[NSMutableArray alloc] init]; 

然後在dealloc的一個版本是足夠的,因爲你必須從ALLOC預期保留1計數。

在另一方面,如果你已經通過使用合成的二傳之一:

[self setMyProperty:[[NSMutableArray alloc] init]]; 

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

那麼你幾乎肯定泄露的對象。您將保留計數增加了兩次(一次通過alloc,一次在設置者中)並且只減少一次(在dealloc)。

最佳IMO是使用調節器和自動釋放池:

self.myProperty = [[[NSMutableArray alloc] init] autorelease]; 

這裏alloc在與本地自動釋放平衡,而setter`s保留與釋放的dealloc平衡。

雖然這種方法涉及兩個額外的方法(setter方法和自動釋放呼叫),它確保了任何保持着以前在該屬性的值是releaseð根據需要(在setter方法)。

+0

@ Seamus Campbell THANX :) – Baidyanath 2012-02-15 10:50:46

0

是的,你仍然需要在dealloc中釋放它。 這兩個頁面是必備讀取的iOS/Cocoa開發有關的內存管理

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

爲了您的具體的例子,看到稱爲第二鏈路上的部分「實現的dealloc放棄所有權對象」

這裏也是這個問題的鏈接堆棧溢出討論: Understanding reference counting with Cocoa and Objective-C

0

如果你做這樣的事情:

my_property = [[NSMutableArray alloc] init]; 

的 'my_property' 假設你的陣列的所有權。你的類的dealloc方法必須釋放數組以防止泄漏。

[my_property release]; 

- 或 -

self.my_property = nil; 
0

如果您正在使用

[self setMutableArray:[[nsmutablearray alloc] init]]; 

在這種情況下,它會釋放其先前分配給它的任何記憶(放棄所有權)。 所以在dealloc方法你只是 寫作

self.mutableArray = nil; 

那麼它將放棄分配給mutableArray所有權和內存會自動釋放

0

在你的情況下,保留計數將是2和陣列保持釋放。當你設置屬性時,你不需要初始化它。