OC的記憶體管理 二 ARC

2022-07-02 23:09:09 字數 3437 閱讀 2403

指標:            指向記憶體的位址

指標變數           存放位址的變數

指標變數值          變數中存放的值(位址值)

指標變數指向的記憶體單元值   記憶體位址指向的值

1):強指標:預設的情況下,所有的指標都是強指標,關鍵字strong

2):弱指標:__weak關鍵字修飾的指標

宣告乙個弱指標的格式:

__weak person *p;

arc概念

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的工作原理

1 arc是objective-c 編譯器的特性,而不是執行時特性或者垃圾**機制,arc所做得只不過是在**編譯時為你自動在合適的位置插入release或autorelease
arc的判斷準則;

1

只要沒有強指標引向物件,物件就會被釋放

2 注意:當使用arc的時候,暫時忘記"

引用計數器

",因為判斷標準變了

如何判斷當前是否處於arc中?

1

1.ios5以後,建立專案預設的都是arc

2 all ----leveles 檢索 auto 可以看到 objective-c automatic referece counting 是否是 yes32

.arc機制下有幾個明顯的標誌:41

)不允許呼叫物件的release方法52

)重寫dealloc方法的時候,不能使用 [super dealloc];

63)不允許呼叫autorelease方法

arc下單物件記憶體管理

1

1.在arc下沒有強指標引用是否會實時的立即被釋放?

2會,只要沒有強指標引向,立刻馬上的被釋放掉3例:

4 car *car =[[car alloc]init];5//

物件有沒有被釋放?

6 car=nil;7//

會不會報錯?

8 car.speed = 10;9

101).會被釋放,car被賦值為nil ,原來在堆區的空間沒有強指標指向,記憶體空間會被釋放

112).不會報錯---->為什麼?

12 car.speed---->[car setspeed:10

];13 當car =nil;

14 [nil csetspeed:10] ;所以不會報錯 //

給nil傳送任何訊息都不會報錯

1516172

.強弱指標181

)強指標

19所有的指標預設就是強指標

20強指標使用__strong 標示212

)弱指標

22用__weak修飾的指標變數,都是弱指標

23//

car 強指標 car2弱指標 兩者指向相同的記憶體空間

24 __weak car *car2 =car;

25 car2 =nil;//

不會是釋放記憶體

arc下多物件記憶體管理

arc下迴圈引用的問題

1 如果是兩個物件迴圈引入,那麼只要將其中的乙個設定為weak 弱指標就可以避免無法釋放的問題
arc下 @property引數

1

arc中的@property

2strong: 用於oc物件,相當於mrc總的retain

3weak:用於oc物件,相當於mrc的assign

4assign: 用於基於資料型別,跟mrc中的assign一樣

5copy: 一般用於nsstring,跟mrc中的copy一樣

6 在arc情況下解決"

迴圈retain

"的問題:@property 一邊用strong,一邊用weak;

arc特點總結

1

1)不允許呼叫release,retain,retaincount22

)可以重寫dealloc,但是不允許呼叫[super dealloc];33

)@property的引數

4strong:相當於原來的retain(適用於oc物件型別),成員變數是強指標

5weak:相當於原來的assign,(適用於oc物件型別),成員變數是弱指標

6 assign:適用於非oc物件型別(基礎型別)

arc使用注意事項

1

1)arc中,只要弱指標指向的物件不在了,就直接把弱指標做清空操作

22)__weak person *p =[[person alloc]init];//

不可以,物件一建立出來就被釋放掉了,對方釋放後,arc把指標自動清零33

)arc中的property處不再使用retain,而是使用strong,在dealloc中不需要在[super dealloc]

4 @perperty(nonatomic,strong)dog *dog;5//

意味著生成的成員變數_dog是乙個強指標,相當於以前的retain

64)如果換成是弱指標,則換成weak,不需要加__;

arc模式下如何相容非arc的類

1

讓程式相容arc和非arc部分。

2 -轉變為非arc -fno-objc-arc

3 -轉變為arc的, -f-objc-arc

mrc 轉換成arc

轉換之前記得先備份檔案

OC記憶體管理之ARC

除了特殊場合,使用arc是大勢所趨。因為這不僅能夠提高程式設計師的開發效率,讓程式設計師把精力專注在功能實現上,也大大節約了專案的開發成本,更提高了程式的可維護性。1.使用arc的重要關注點就是 物件是否有強指標指向,沒有強指標指向的物件會被系統自動 2.property關鍵字 強指標用strong...

OC的ARC(自動記憶體管理)注意事項

記憶體管理原則 配對原則 只要出現了new,alloc,retain方法,就要配對出現release,autorelease 物件存入到自動釋放池中,當這個池子被銷毀的時候他會對池子中所有的物件進行一次release操作 怎麼把物件存到池子中 arc簡單,不用程式設計師在去管理記憶體 1.強指標 s...

OC中非ARC環境下的記憶體管理小記

一 計數器的基本操作 1 retain 1 2 release 1 3 retaincount 獲得計數器的值 二 set方法的記憶體管理 1 set方法的實現 void setcar car car if car car car release car car 2 dealloc方法的實現 不要直...