OC的內存管理(二)ARC

指針:            指向內存的地址
指針變量           存放地址的變量
指針變量值          變量中存放的值(地址值)
指針變量指向的內存單元值   內存地址指向的值
1
):強指針:默認的狀況下,全部的指針都是強指針,關鍵字strong 2):弱指針:__weak關鍵字修飾的指針 聲明一個弱指針的格式: __weak Person *p;

ARC概念atom

1 Automatic Reference Counting,自動引用計數,即ARC,也能夠說是WWDC2011和IOS5所引用的最大的變革和最激動人心的變化。ARC是新的LLVM3.0編譯器的一項特性,使用ARC,能夠說一舉解決了廣大IOS開發者所憎恨的手動管理內存的麻煩
2 在工程中使用ARC很是簡單:只須要像往常那樣編寫代碼,只不過永遠不寫retain,release和autorelesase三個關鍵字就能夠~這是ARC的基本原則
3 在ARC開啓時,編譯器將自動在代碼什麼時候的地方插入retain,release 和autorelease,而做爲開發者,徹底不須要擔憂編譯器會作錯(除非開發者本身錯用ARC了)
4 手動管理內存,能夠簡稱MRC(Manual Reference Counting)
5 ARC與其餘語言的"垃圾回收"機制不一樣,ARC:編譯器特性:"垃圾回收"運行時特性

ARC的工做原理spa

1 ARC是Objective-C 編譯器的特性,而不是運行時特性或者垃圾回收機制,ARC所作得只不過是在代碼編譯時爲你自動在合適的位置插入release或autorelease

ARC的判斷準則;3d

1 只要沒有強指針引向對象,對象就會被釋放
2 注意:當使用ARC的時候,暫時忘記"引用計數器",由於判斷標準變了

如何判斷當前是否處於ARC中?指針

1 1.IOS5之後,建立項目默認的都是ARC
2             ALL ----leveles  檢索 auto 能夠看到 Objective-C Automatic Referece Counting 是不是 yes
3 2.ARC機制下有幾個明顯的標誌:
4     1)不容許調用對象的release方法
5     2)重寫dealloc方法的時候,不能使用 [super dealloc];
6     3)不容許調用autorelease方法

ARC下單對象內存管理code

 1 1.在ARC下沒有強指針引用是否會實時的當即被釋放?
 2      會,只要沒有強指針引向,馬上立刻的被釋放掉
 3 例:
 4     Car *car =[[Car alloc]init];
 5     //對象有沒有被釋放?
 6     car=nil;
 7     //會不會報錯?
 8     car.speed = 10;
 9 
10     1).會被釋放,car被賦值爲nil ,原來在堆區的空間沒有強指針指向,內存空間會被釋放
11     2).不會報錯---->爲何?
12        car.speed---->[car setSpeed:10];
13        當car =nil;
14         [nil csetSpeed:10] ;因此不會報錯 //給nil發送任何消息都不會報錯
15          
16 
17 2.強弱指針
18     1)強指針
19          全部的指針默認就是強指針
20          強指針使用__strong 標示
21     2)弱指針
22          用__weak修飾的指針變量,都是弱指針
23         //car 強指針 car2弱指針  二者指向相同的內存空間
24         __weak Car *car2 = car;    
25         car2 =nil;//不會是釋放內存

ARC下多對象內存管理對象

ARC下循環引用的問題blog

1 若是是兩個對象循環引入,那麼只要將其中的一個設置爲weak 弱指針就能夠避免沒法釋放的問題

ARC下 @property參數內存

1 ARC中的@property
2 strong: 用於OC對象,至關於MRC總的retain
3 weak:用於OC對象,至關於MRC的assign
4 assign: 用於基於數據類型,跟MRC中的assign同樣
5 copy: 通常用於NSString,跟MRC中的copy同樣
6 在ARC狀況下解決"循環retain"的問題:@property 一邊用strong,一邊用weak;

ARC特色總結開發

1 1)不容許調用release,retain,retainCount
2 2)能夠重寫dealloc,可是不容許調用[super dealloc];
3 3)@property的參數
4     Strong:至關於原來的retain(適用於OC對象類型),成員變量是強指針
5     Weak:至關於原來的assign,(適用於OC對象類型),成員變量是弱指針
6     Assign:適用於非OC對象類型(基礎類型)

ARC使用注意事項編譯器

1 1)ARC中,只要弱指針指向的對象不在了,就直接把弱指針作清空操做
2 2)__weak Person *p =[[Person alloc]init];//不能夠,對象一建立出來就被釋放掉了,對方釋放後,ARC把指針自動清零
3 3)ARC中的property處再也不使用retain,而是使用strong,在dealloc中不須要在[super dealloc]
4     @perperty(nonatomic,strong)Dog *dog;
5      //意味着生成的成員變量_dog是一個強指針,至關於之前的retain
6 4)若是換成是弱指針,則換成weak,不須要加__;

ARC模式下如何兼容非ARC的類

1 讓程序兼容ARC和非ARC部分。
2          -轉變爲非ARC -fno-objc-arc 
3          -轉變爲ARC的, -f-objc-arc

 

MRC 轉換成ARC

轉換以前記得先備份文件

相關文章
相關標籤/搜索