一。內存管理/引用計數
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以上。
新聞熱點
疑難解答