的我有一個的NSMutableArray中的AppDelegate 我使用的財產(非原子,保留) 和didfinishlaunch再次合成它關於使用非原子,留住產權
使用分配它[NSMutableArray裏的alloc]初始化];
所以,我的疑問是,如果我使用版本方法在deallloc中發佈它。 是否正確發佈? 或仍然保留計數在那裏。 如果我做錯了,請提供適當的解決方案。
的我有一個的NSMutableArray中的AppDelegate 我使用的財產(非原子,保留) 和didfinishlaunch再次合成它關於使用非原子,留住產權
使用分配它[NSMutableArray裏的alloc]初始化];
所以,我的疑問是,如果我使用版本方法在deallloc中發佈它。 是否正確發佈? 或仍然保留計數在那裏。 如果我做錯了,請提供適當的解決方案。
這取決於你是如何分配的。如果你的任務是直接向伊娃,像
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方法)。
@ Seamus Campbell THANX :) – Baidyanath 2012-02-15 10:50:46
是的,你仍然需要在dealloc中釋放它。 這兩個頁面是必備讀取的iOS/Cocoa開發有關的內存管理
爲了您的具體的例子,看到稱爲第二鏈路上的部分「實現的dealloc放棄所有權對象」
這裏也是這個問題的鏈接堆棧溢出討論: Understanding reference counting with Cocoa and Objective-C
如果你做這樣的事情:
my_property = [[NSMutableArray alloc] init];
的 'my_property' 假設你的陣列的所有權。你的類的dealloc方法必須釋放數組以防止泄漏。
[my_property release];
- 或 -
self.my_property = nil;
如果您正在使用
[self setMutableArray:[[nsmutablearray alloc] init]];
在這種情況下,它會釋放其先前分配給它的任何記憶(放棄所有權)。 所以在dealloc方法你只是 寫作
self.mutableArray = nil;
那麼它將放棄分配給mutableArray所有權和內存會自動釋放
在你的情況下,保留計數將是2和陣列保持釋放。當你設置屬性時,你不需要初始化它。
如果這是一個新項目,請打開ARC。 – bbum 2012-02-15 06:44:27