標籤:ios開發基礎 oc 自動釋放池 arc 弱指標自動nil化
結合之前的學習筆記以及參考《Objective-C編程全解(第三版)》,對Objective-C知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文檔為準~
十六、記憶體管理相關知識(二)
1、autorelease,自動釋放機制
- (instancetype)autorelease;
(1)自動釋放池的建立
iOS5.0之前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //進行一系列操作 //此處不可以使用break、return、goto之類的語句 Person *p = [[[Person alloc] init] autorelease]; [pool release];
iOS5.0之後
@autoreleasepool { //進行一系列操作 //此處可以使用break、return、goto等語句 //代碼 };
ARC中是禁用NSAutoreleasePool的,而是用新文法來進行操作,效能更好,效率更高。
(2)基本用法
a、會將調用autorelease方法的對象放入自動釋放池中;
b、當pool銷毀時,池中記錄的所有對象都會被發送release訊息;
c、調用autorelease方法不影響引用計數器的計數值,返回對象本身;
(3)優缺點
優點:不必擔心執行個體對象何時釋放,不必擔心何時調用release
缺點:不能精確控制對象釋放時間;若為大型物件,應該使用完立即釋放,否則會佔用記憶體。
(4)儲存方式
a、以棧的資料結構進行儲存,釋放時遵循先進後出;
b、iOS程式運行過程中,允許建立多個pool,可以嵌套使用
@autoreleasepool { @autoreleasepool { //XXXX } }
c、當一個執行個體對象調用aurelease方法時,會將此執行個體對象放入棧頂的自動釋放池。
(5)在實際開發中,往往建立類方法快速建立對象
+ (id)person { return [[[self alloc] init] autorelease]; }
注意:不指定類型,使用self,這樣既可以實現父類對象建立,又可以實現子類對象建立
通常系統內建的方法中若不帶alloc,new,copy關鍵字,說明返回的執行個體對象是經過了autorelease的,不需要再手動調用release
2、ARC:Automatic Reference Counting,自動引用計數
(1)基本特徵
a、一種編譯器特性,Xcode5.0以後建立的項目自動執行ARC機制;
b、編譯器會根據賦值操作、變數的初始變化、變數的生命週期等因素,在釋放的位置自動加入retain/release/autorelease相關的代碼;
c、ARC只能管理OC對象,不能管理通過malloc申請的記憶體
(2)ARC判斷對象是否應該釋放的準則:
只要沒有強指標指向此對象,就會被釋放;
(3)注意要點:
a、ARC有效地程式中,不能調用與引用計數有關的方法retain,release,autorelease,retainCount
同時也不能那個使用這類函數的selector(@selector(retain));
b、可重寫dealloc,但不能調用[super delloc];
c、@property相關參數修改
strong:成員變數為強指標類型,相當於MRC中的retain(使用於OC對象)
weak:弱指標類型,相當於MRC中的assign(使用於OC對象)
assign:非指標類型(適用於非OC對象)
unsafe_unretained:非nil化的弱指標
(4)循環參考:一端用strong,一端用weak
3、強指標,弱指標(強引用,弱引用)
(1)強指標:__strong,擁有所有權的指標
(2)弱指標:__weak,不會對對象的釋放產生影響
a、為了避免循環參考,需要這類變數能夠引用對象,但不會成為對象所有者,不影響對象本身的而回收
b、弱指標是通過儲存一個指向對象的指標建立的,且不保留對象
c、弱引用情況下,無論對變數賦值或解除引用,變數的引用計數都不會發生變化;
(3)__unsafe_unretained:非nil化的弱指標,即當所指向的記憶體地區被釋放了,這個指標就是一個野指標了;
a、跟字面意思一樣,這種類型的變數時不安全的,野指標操作不當會造成嚴重後果;
b、有一些類的執行個體不能使用自動nil化的弱引用,需要使用__unsafe_unretained代替__weak
例如lion ReleaseNote中NSWindows、NSTextView、NSFont、NSImage等類的執行個體不能使用弱引用,不過未來是否支援,或者當前可自動nil化的未來是否繼續支援不得而知。
使用時將上述修飾詞加在對象前
例如: __unsafe_unretained Person* p;
4、弱指標的自動nil化
弱指標會在其指向的執行個體對象被釋放後自動變成nil;
即當弱指標指向的執行個體對象被釋放了,弱指標也不會變成野指標
5、方法族:同對象產生相關的方法集合
需要滿足以下命名規則(必須遵守,否則ARC可能不會釋放對象,造成記憶體泄露)
——選取器同方法族名相同(開頭的_可忽略),或選取器的名字由方法族名加上非小寫字母開頭的字串構成
例如
init initWithName: initToMemory _init:locale
錯誤:
initialize init後面不可接小寫字母 initwithName init後面不可接小寫字母 do_init 不以init開頭
目前OC有5個方法族
alloc方法族 copy方法族 mutableCopy方法族 new方法族 以上4種以其開頭的方法表示調用者對被建立的對象擁有所有權,返回的對象必須是可以被retain的 init方法族
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C(十六、記憶體管理,自動釋放池,ARC,強指標,弱指標,方法族)——iOS開發基礎