這個系列打算寫一些我對iphone開發記憶體管理的理解。是建立在讀者對objective c的記憶體管理已經有一定理解的基礎上,內容將包括實踐準則,autorelease原理剖析,記憶體洩露的除錯等。如果您對objective c記憶體管理不太了解,建議先讀一下vince yuan的這個
教程。在進行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。
IOS學習 OC記憶體管理
記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...
iOS開發之oc(十一) 記憶體管理MRC
掌握內容 理解記憶體管理的原理 1.理解部分 1點選工程 build settings 通過gar關鍵字的搜尋搜出automatic re.cou.將此選項的設定改稱no 1.2.2析構函式 可以用來驗證物件是否被釋放 語法 void dealloc void setdog dog dog void...
OC 記憶體管理之MRC
隨著蘋果對xcode的逐步優化,arc記憶體管理方式已經深入人心,但現實是當下某些公司的一些老的專案可能還是用mrc模式寫的。所以這兩種方式我們都應該掌握。mrc mannulreference counting,顧名思義,就是手動記憶體管理。1 管理的物件 一切繼承自nsobject,在堆區申請記...