程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Objective C內存管理之實踐准則

Objective C內存管理之實踐准則

編輯:C++入門知識

這個系列打算寫一些我對iPhone開發內存管理的理解。是建立在讀者對Objective C的內存管理已經有一定理解的基礎上,內容將包括實踐准則,autorelease原理剖析,內存洩露的調試等。如果您對Objective C內存管理不太了解,建議先讀一下Vince Yuan的這個教程。

專題:iPhone應用程序開發初探

在進行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。

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

4)autorelease 意味著該object會由系統在某個時機release它。

5)確保你返回的object是有效的。在如下例子中, 因為heisenObject 被從array中remove掉,會有一個release message到heisenObject,如果沒有其它人reference它, heisenObject會被dealloc 掉。


6) 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內存管理進階(一):實踐准則

鏈接:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779755.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved