Objective-C內(nèi)存管理 實踐準則
Objective-C內(nèi)存管理 實踐準則是本文要介紹的內(nèi)容,這個系列打算寫一些我對Iphone開發(fā)內(nèi)存管理的理解。是建立在讀者對Objective-C的內(nèi)存管理已經(jīng)有一定理解的基礎(chǔ)上,內(nèi)容將包括實踐準則,autorelease原理剖析,內(nèi)存泄露的調(diào)試等。如果您對Objective-C內(nèi)存管理不太了解,建議先讀一下Vince Yuan的這個教程。
在進行IPhone開發(fā)時,內(nèi)存管理是個相對比較難以理解的東西。Objective-C 使用了一種介于C#和C++之間的內(nèi)存管理機制。C#是基于Mark-sweep的GC,C++基本上是程序員自己負責(zé)分配和釋放。Ojbective-C,是程序員來負責(zé)Mark(通過Release,retain,alloc)計數(shù), 系統(tǒng)來進行分配和釋放。下面是一些準則,可以避免內(nèi)存泄露和使用已釋放的內(nèi)存造成程序crash。
1、你必須為你自己創(chuàng)建的Object負責(zé)。包括alloc,newObject,mutableCopy 等,或者是你調(diào)用過retain的object。對于這些Object,你必須調(diào)用release 或autorelease。
2、對于其它函數(shù)返回的Object,你不能release它,原則上應(yīng)該由被調(diào)用的函數(shù)來負責(zé)。e.g. NSString str = [NSString stringWithFormat:]. 你自己寫的函數(shù)也最好遵循這個準則,誰申請,誰釋放,而不要讓調(diào)用者來釋放。
3、如果你要在某個對象的property里存儲另外一個對象,你必須retain 或者copy 它,避免它被別人release。
@property(retain)。這里的retain關(guān)鍵字會自動做這個事情。如果你自己聲明set方 法就要手動做這個事情。
4、關(guān)于IPhone內(nèi)存管理的其它10個Tips。其中比較有用的包括盡量避免使用Autorelease,以及[UIImage imageNamed:],打開NSZombieEnabled.
5、weak reference. 如下圖,Document 類中Page property 指向Page類的對象,page類中Parent property指向Document,這樣如果互相之間的retain count都是1的話,那么這兩個object永遠不會被Dealloc。解決辦法是把page.parent變?yōu)閣eak reference,也就是說,page.parent并不retain Document。 UITableView.datasource, notification observers, delegates, outline view items 等都是week reference。
小結(jié):Objective-C內(nèi)存管理 實踐準則的內(nèi)容介紹完了,希望本文對有所幫助!