指針: 指向內存的地址
指針變量 存放地址的變量
指針變量值 變量中存放的值(地址值)
指針變量指向的內存單元值 內存地址指向的值
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
轉換以前記得先備份文件