ARC(自動引用計數)

2021-06-25 16:10:44 字數 4248 閱讀 8401

arc

arc是automatic reference counting(自動引用計數)的縮寫,是ios5一同推出的新特性,但是ios4.3也支援arc,只是不能使用weak。

使用arc,不需要再retain、release、autorelease,因為編譯器會在合適的地方自動的插入retain、release。

arc的**法則

1.只要還有乙個變數(指標)指向物件,物件就會保持在記憶體中;

2.__strong告訴編譯器此處新增retain,__strong可以省略。

nsstring *string = @"ray"

__strong nsstring *string = @"ray"

以上兩種寫法是等同的。

3.在arc中。dealloc方法中不允許呼叫[super deslloc]

4.在arc中,不允許使用retaincount屬性、列印引用計數

5.在arc中,不允許使用retain、release、autorelease,可以使用copy。

strong的使用

有兩個指標指向了字串物件@"ray"

nsstring *firstname = @"ray";

self.textfield.text = firstname;

當self.textfield.text 指向字串@"rayman」,會先對@"ray」物件release;

當firstname指向了@""字串物件時,先會對原來指向的@"ray」物件release。此時@"ray」物件就沒有乙個指標指向它,引用計數也就是0,因此銷毀。

weak的使用

weak修飾的變數不會將物件retain;

weak變數指向的物件如果銷毀了,則weak所修飾的變數自動變為nil;

strong與weak

在引用strong修飾的物件時,該物件會被retain;

預設所有例項變數和本地變數都是strong型別的指標;(本地變數

weak修飾的物件不會對此物件retain,相當於手動管理的assign。

在ios4.3中arc不能使用weak,替代者為:__unsafe_unretained,__unsafe_unretained與weak的功能一致,區別在於當指向的物件銷毀後,不會將變數設定為nil;這樣就有可能呼叫野指標。

weak可以防止迴圈引用,典型的就是delegate模式

**物件delegate應該設定成weak;

property的修飾符總結

1.strong:等同於retain,屬性成為物件的擁有者

2.weak:屬性是weak pointer,當物件釋放時會自動設定為nil,記住outlet應該使用weak

3. __unsafe_unretained:等同於之前的assign,只有ios4才能使用

4.copy:和之前的copy一樣,複製乙個物件並建立strong關聯

5.assign:物件不能使用assign,但是原始(bool、int、float)仍然可以使用。

block在arc中的記憶體管理

在手動管理記憶體時,使用如下方式防止迴圈引用

__block sendviewcontronller *this = self;

_faceview = [[facescrollview alloc] initwithblock:^(nsstring *facename)];

arc中不能這樣使用,以為變數this預設是strong引用,即使標記為__block也仍然為strong型別的引用,這時候__block的唯一功能是允許你修改已捕獲的變數(沒有__block則變數是唯讀)

__weak sendviewcontronller *weakself = self;

__faceview = [[facescrollview alloc] initwithblock:^(nsstring *facename)

}];

__weak id weakself = self;

block = ^()

};

arc中使用toll-free bridging

toll-free bridging,簡稱tfb。是一種允許某些objc類與其對應的corefoundation類之間可以互換使用的機制。

比如:nsstring與cfstring是橋接的,這意味著可以將任意的nsstring當作cfstring使用,也可以將任意的cfstring當作nsstring使用。

arc只能對oc物件進行記憶體管理,cfstring橋接成nsstring物件之後,此物件的記憶體管理該如何讓管理?

在arc中,cfstring橋接成nsstring使用__bridge_transfer, __bridge_transfer的作用將其他型別的物件轉變成為乙個oc物件,由arc管理;與__bridge_transfer相同作用的還有cfbridgingrelease。

__bridge_retained的使用:nsstring橋接成cfstring用__bridge_retained,

對於某些我們不希望使用 arc 的檔案,例如第三方庫原始檔,可以在 project settings -> build phases 中,對這些檔案選中 -fno-objc-arc標誌。這樣 xcode 編 譯專案時,這些檔案就不會使用 arc,-fobjc-arc 標誌是允許使用arc

ARC自動引用計數

選擇專案的屬性檔案 搜尋 automatic reference objective c automatic reference counting yes arc 並不是gc在執行中判斷引用計數是否為0,從而清除記憶體。而是在 編譯之前通過靜態分析工具analyze自動生成記憶體管理 開啟arc後,...

Swift 自動引用計數(ARC)

swift使用自動引用技術 arc 這一機制來跟蹤和管理應用程式的記憶體。通常情況下我們不需要去手動釋放記憶體,因為arc會在類的例項不再被使用時,自動釋放其占有的記憶體。但在有些時候我們還是需要在 中實現記憶體管理。class person deinit 值會被自動初始化為nil,目前還不會引用到...

ARC自動引用計數和分類

1.物件自動釋放池的使用 person p person new autoreleasepool 快速建立類的類方法定義 instancetype person person p person person arc專案如何相容mrc的 專案 編譯選項 雙擊類檔案 fno objc arc 將乙個類中...