Objective-C(十六、記憶體管理,自動釋放池,ARC,強指標,弱指標,方法族)——iOS開發基礎

來源:互聯網
上載者:User

標籤: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開發基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.