Objective-C內存管理 實踐準則

在進行IPhone開發時,內存管理是個相對比較難以理解的東西。Objective-C 使用了一種介於C#C++之間的內存管理機制。C#是基於Mark-sweep的GC,C++基本上是程序員自己負責分配和釋放。Ojbective-C,是程序員來負責Mark(通過Release,retain,alloc)計數, 系統來進行分配和釋放。下面是一些準則,可以避免內存泄露和使用已釋放的內存造成程序crash。

1、你必須爲你自己創建的Object負責。包括alloc,newObject,mutableCopy 等,或者是你調用過retain的object。對於這些Object,你必須調用release 或autorelease。

2、對於其它函數返回的Object,你不能release它,原則上應該由被調用的函數來負責。e.g. NSString str = [NSString stringWithFormat:].  你自己寫的函數也最好遵循這個準則,誰申請,誰釋放,而不要讓調用者來釋放。

3、如果你要在某個對象的property裏存儲另外一個對象,你必須retain 或者copy 它,避免它被別人release。

@property(retain)。這裏的retain關鍵字會自動做這個事情。如果你自己聲明set方 法就要手動做這個事情。

4、關於IPhone內存管理的其它10個Tips。其中比較有用的包括儘量避免使用Autorelease,以及[UIImage imageNamed:],打開NSZombieEnabled.

5、weak reference. 如下圖,Document 類中Page property 指向Page類的對象,page類中Parent property指向Document,這樣如果互相之間的retain count都是1的話,那麼這兩個object永遠不會被Dealloc。解決辦法是把page.parent變爲weak reference,也就是說,page.parent並不retain Document。 UITableView.datasource, notification observers, delegates, outline view items 等都是week reference。

Objective-C內存管理 實踐準則

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章