標籤:記憶體管理 arc objective
記憶體管理之 ARC 和 自動釋放池一、ARC 中的變數所有權修飾符
變數修飾符,主要用來標識對象的生命週期.在手動記憶體管理方式中沒有這些概念.
ARC 環境下變數所有權修飾符主要有以下幾個:
__strong __weak__unsa_unretained__autoreleasing
詳細說明:
(1) 變數預設值都是__ strong 修飾
只要強引用存在,對象就不能釋放.當超過了對象的範圍以及沒有強引用時,對象會自動銷毀.
_strong 屬性基本上能適應 ARC 環境下的所有情況.如果不寫的話,預設為_ strong 屬性.
(2) __weak 不持有對象,只是簡單地引用而已.
也就是說,_weak不會影響對象的銷毀,只要__weak 修飾的對象沒有強引用時,就會自動銷毀,這時候_ weak 變數會自動化佈建成 nil.
下面是一個例子
NSString *__weak str = [][NSString alloc] initWithFormat:@"I am studying"]; NSLog (@"str : %@",str);
因為 str 這個對象是弱引用,編譯器會提示,這是一個弱引用,輸出的結果: str:null
在你開啟ARC時,你是不能使用retainrelease autorelease 操作的,原先需要手動添加的用來處理記憶體管理的引用計數的代碼可以自動地由編譯器完成了,但是你需要在對象屬性上使用weak 和strong, 其中strong就相當於retain屬性,而weak相當於assign,基礎類型還是使用assign。
二、自動釋放池
- 自動釋放池是一個存放實體的集合,這些實體可能是對象,這些對象能夠被自動釋放.
- (id)autorelease;// 是 NSObject提供的方法,此方法在某一個預定的時候,想對象發送 release 訊息,傳回值是接收訊息的對象.實際上當給一個對象發送 autorelease 訊息的時候,就是將這個對象添加到自動釋放池( NSAutoreleasePool) 中,當自動釋放池被銷毀時,會向該池中的所有對象發送 release 訊息
臨時對象和擁有對象
當使用如:arrayWithCapacity這樣的方法擷取臨時對象的時候,你不必考慮記憶體釋放問題。
[NSColor blueColor]; 單例對象,永遠不會被銷毀,但是你也不必考慮它的記憶體問題。
如果在你自訂的類中依賴其它對象時,你需要重寫dealloc方法,並且在這個方法中釋放依賴的對象
如果在設計的迴圈體中會佔用較多的記憶體空間,建議手動建立自動釋放池。如:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for ( int i = 0; i < 1000000; i++) { id object = [someArray objectAtIndex:i]; NSString *desc = [object description]; // and do something with te descripton if ( i % 100 == 0) { [pool release]; pool = [[NSAutoreleasePool alloc] init]; } }
APC 的本質
- ARC 本質上是由編譯器在編譯階段,在合適的地方插入 retain 和 release 方法.
- ARC 是編譯時間的特性.
關於 ROP 和 non-ROP
所有權歸屬問題
NSString *theString = @"Hello,Henan"; CFStringRef cfString = (CFStringRef)theString// __bridge cfString = (__bridge CFStringRef)theString //指標的所有權不變,所以是 theString// __bridge_retained cfString = (__bridge_retained CFStringRef)theString// 指標的所有權對象是 cfString// __bridge_transfer cfString = (__bridge_transfer CFStringRef)theString// 指標的所有權屬於 theString
使用 ARC 的一些強制規定
- 不能直接調用 dealloc 方法,不能調用 retain,release,autorelease,retainCount 方法,包括@ selector(retain) 的方法也不行.
- 如果你需要管理資源而不是釋放執行個體變數,你應該事先 dealloc 方法.不能再 dealloc 方法裡面去調[ super dealloc] 方法,在 ARC下父類的 dealloc 同樣由編譯器來自動完成.
- Core Foundation 類型的對象仍然可以用 CFRetain,CFRealese 這些方法.
- 不能在使用 NSAllocateObject和 NSDeallocateObject 對象.
- 不能在 C 結構中使用對象指標,如果有類似功能,可以建立一個 Objective-C 類來管理這些對象
- 在 id和 void * 之間沒有簡便的轉換方法,同樣在Objective-C 和 Core Foundation 類型之間的轉換都需要使用編譯器指定的轉換函式.
- 不能再使用 NSAutoreleasePool 對象, ARC 提供了@ autoreleasepool 塊來替代它,這樣更加有效率.
- 不能使用記憶體儲存區(不能再使用 NSZone)
- 不能以 new 為開頭給一個屬性命名.
- 聲明 outlet 時一般使用 weak, 除了對 StoryBoard 這樣的 nib 中間的頂層對象要用 strong.
- weak 相當於老版本的 assign,strong 相當於 retain.
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C 記憶體管理之 _ARC