Objective C內(nèi)存管理之實踐準(zhǔn)則
這個系列打算寫一些我對iPhone開發(fā)內(nèi)存管理的理解。是建立在讀者對Objective C的內(nèi)存管理已經(jīng)有一定理解的基礎(chǔ)上,內(nèi)容將包括實踐準(zhǔn)則,autorelease原理剖析,內(nèi)存泄露的調(diào)試等。如果您對Objective C內(nèi)存管理不太了解,建議先讀一下Vince Yuan的這個教程。
在進(jìn)行iPhone開發(fā)時, 內(nèi)存管理是個相對比較難以理解的東西。Objective-C 使用了一種介于C#和C++之間的內(nèi)存管理機制。C#是基于Mark-sweep的GC,C++基本上是程序員自己負(fù)責(zé)分配和釋放。Ojbective-C,是程序員來負(fù)責(zé)Mark(通過Release, retain, alloc)計數(shù), 系統(tǒng)來進(jìn)行分配和釋放。下面是一些準(zhǔn)則,可以避免內(nèi)存泄露和使用已釋放的內(nèi)存造成程序crash。
1)你必須為你自己創(chuàng)建的Object負(fù)責(zé)。包括alloc, newObject,mutableCopy 等,或者是你調(diào)用過retain的object。對于這些Object, 你必須調(diào)用release 或autorelease
2)對于其它函數(shù)返回的Object,你不能release它,原則上應(yīng)該由被調(diào)用的函數(shù)來負(fù)責(zé)。e.g. NSString str = [NSString stringWithFormat:]. 你自己寫的函數(shù)也最好遵循這個準(zhǔn)則,誰申請,誰釋放,而不要讓調(diào)用者來釋放。
3)如果你要在某個對象的property里存儲另外一個對象,你必須retain或者copy它,避免它被別人release。
@property(retain)。。 這里的retain關(guān)鍵字會自動做這個事情。如果你自己聲明set方法就要手動做這個事情。
4)autorelease 意味著該object會由系統(tǒng)在某個時機release它。
5)確保你返回的object是有效的。在如下例子中, 因為heisenObject 被從array中remove掉,會有一個release message到heisenObject,如果沒有其它人reference它, heisenObject會被dealloc 掉。
- heisenObject = [array objectAtIndex:n];
- [array removeObjectAtIndex:n];
- // heisenObject could now be invalid.
6) weak reference. 如下圖, Document 類中Page property 指向Page類的對象, page類中Parent property指向Document, 這樣如果互相之間的retain count都是1的話,那么這兩個object永遠(yuǎn)不會被Dealloc。 解決辦法是把page.parent變?yōu)閣eak reference,也就是說, page.parent并不retain Document。 UITableView.datasource, notification observers, delegates, outline view items 等都是week reference。
原文標(biāo)題:Objective C內(nèi)存管理進(jìn)階(一):實踐準(zhǔn)則
鏈接:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779755.html
【編輯推薦】