ARC————自動引用計數,arc計數
一。記憶體管理/引用計數
1.引用計數式記憶體管理的方式(下面四種)
對象操作 OC方法
產生並持有對象 alloc/new/copy/mutableCopyd等方法
持有對象 retain方法
釋放對象 release方法
廢棄對象 dealloc方法
這些有關記憶體管理的方法,實際上不包括在該語言中,而是包含在Cocoa架構中用於OS X,IOS應用開發。
Cocoa架構中的Foundation架構庫的NSObject類擔負記憶體管理的職責。
OC記憶體管理中的alloc、retain、release、dealloc方法分別指代NSObject類的alloc類方法、retain執行個體方法、release執行個體方法和dealloc執行個體方法。
a。自己產生的對象,自己持有。
aa。使用以下名稱開頭的方法名意味著自己產生的對象只有自己持有:alloc、new、copy、mutableCopy。
ab。[[NSObject alloc] init] = [NSObject new];
ac。copy方法利用基於NSCopying方法約定,由各類實現的copyWithZone:方法產生並持有對象的副本。
ad。mutableCopy方法裡利用基於NSMutableCopying方法約定,由各類實現的mutableCopyWithZone:方法產生並持有對象的副本。
b。非自己持有的對象,自己也能持有。
id obj = [NSMutableArray array];
[obj retain];
通過retain方法,非自己持有的對象跟用上述方法產生並持有的對象一樣,成為了自己所持有的方法。
c。不再需要自己持有的對象時釋放
ca。自己持有的對象,一旦不再需要,持有人有義務釋放該對象。釋放用release方法。
cb。自己產生而非自己所持有的對象,若用retain方法變為自己持有,也同樣可以用release方法釋放。
d。無法釋放非自己持有的對象
2.alloc/retain/release/dealloc實現
在OC的對象中存有引用計數這一整數值。
調用alloc或是retain方法後,引用計數值加1.
調用release後,引用計數值減1.
引用計數值為0時,調用dealloc方法廢棄對象。
3.蘋果的實現
4.autorelease及其實現
autorelease的具體使用方法:
a。產生並持有對象的NSAutoreleasePool對象。
b。調用已指派對象的autorelease執行個體方法。
c。廢棄NSAutoreleasePool方法。
********************************
二。ARC規則
1.概要
設定ARC有效編譯方法:
使用clang(LLVM編譯器)3.0或以上版本。
指定編譯器屬性為“-fobjc-arc”。
2.記憶體管理的思考方式
和上面的一樣。
3.所有權修飾符
a。OC編程中為了處理對象,可將變數類型定義為id類型或各種物件類型。
id類型用於隱藏物件類型的類名部分,相當於C語言中常用的“void *”。
物件類型就是指向NSObject這樣的OC類的指標,如“NSObject *”。
b。ARC有效時,id類型和物件類型同C語言其他類型不同,其類型上必須附加所有權修飾符。所有權修飾符有四種: _strong/_weak/_unsafe_unretained/_autoreleasing。
c。_strong修飾符
ca。_strong修飾符是id類型和物件類型預設的所有權修飾符。
cb。_strong修飾符表示對對象的“強引用”。持有強引用的變數在超出其範圍時被廢棄,隨著強引用的失效,引用的對象會隨之釋放。
cd。附有_strong修飾符的變數之間可以相互賦值。
ce。在OC類成員變數和方法參數上,都可以使用_strong修飾符。
cf。_strong修飾符和_weak/_autoreleasing修飾符一起,可以保證將附有這些修飾符的自動變數初始化為nil。
如:id _strong obj0; == id _strong obj0 = nil;
d._weak修飾符
da。使用_strong修飾符的成員變數在持有對象時,很容易發生循環參考。
db。循環參考容易發生記憶體泄露。記憶體泄露就是應當廢棄的對象在超出其生存周期後繼續存在。
dc。使用_weak修飾符可以避免循環參考。
dd、_weak修飾符還有另一有優點。在持有某對象的弱引用時,若該對象被廢棄,則此弱引用將自動失效且處於nil被賦值的狀態(空弱引用)。
de。綜上,使用_weak修飾符可避免循環參考。通過檢查附有_weak修飾符的變數是否為nil,可以判斷被賦值的對象是否已廢棄。
df。但是,_weak修飾符只能用於ios5以上以及OS X Lion以上版本的應用程式。在ios4以及OS X Snow Leopard的應用程式中可使用_unsafe_unretained修飾符來代替。
e。_unsafe_unretained修飾符
f。_autoreleasing修飾符
fa。ARC有效時autorelease方法不能使用,也不能使用NSAutoreleasePool類。但是,autorelease功能是起作用的。
fb.id的指標或對象的指標在沒有顯式指定時會被附上_autoreleasing修飾符。
fc。為了得到錯誤的詳細資料,經常會在方法的參數中傳遞NSError對象的指標,而不是函數傳回值。
4.規則
a。不能使用retain、release、retainCount、autorelease。
a1。記憶體管理是編譯器的工作,因此沒有必要使用記憶體管理的方法(retain、release、retainCount、autorelease)。
a2。不能使用NSAllocateObject、NSDeallocateObject。
a3。續遵守記憶體管理的方法命名規則
a4。不要顯示調用dealloc。
a5。使用@autorelease塊替代NSAutoreleasePool。
a6。不能使用地區(NSZone)。
a7。對象型變數不能作為C語言結構體的變數。
a8.顯示轉換id和void*。
5.屬性
a。當ARC有效時,OC類的屬性也會發生變化
b。屬性聲明的屬性與所有權修飾符的對應關係:
assign ———— _unsafe_unretained
copy ———— _strong
retain ———— _strong
strong ———— _strong
unsafe_unretained ———— _unsafe_unretained
以上各種屬性賦值給指定的屬性中就相當於賦值給附加各屬性對應的所有權修飾符的變數中。
其中,只有copy屬性不是簡單的賦值,它賦值的是通過NSCopying介面的copyWithZone:方法複製賦值源所產生的對象。
**************************
三。ARC的實現
ARC是“由編譯器進行記憶體管理”的,但實際上只有編譯器是無法完全勝任的,在此基礎上還需要OC執行階段程式庫的協助。也就是說,ARC由以下工具、庫來實現:
clang(LLVM編譯器)3.0以上
objc4 Objective-C執行階段程式庫493.9以上。