ios高效開發二 ARC跟block那點事

2021-06-26 20:43:41 字數 1219 閱讀 4605

block是可以捕捉上下文的特殊**塊。

block可以訪問定義在block外的變數,當在block中使用時,它就會為其在作用域內的每個標量變數建立乙個副本。

如果通過self擁有乙個block,然後又在block中改變了例項變數,就會出錯。

例如:

1 self.block = ^(nsstring *astring)

2);

這段**中,self保留了block,同時block又保留了self,會引發迴圈保留。很危險。

如果未使用arc,可以使用__block和__unsafe_unretained來複製乙個未保留的引用副本。

1

//例如:(無arc)

2 __block id safeself =self;

3 self.block = ^(nsstring *astring)4);

78//(有arc)

9 __weak id safeself = self; //

ios 5

10//

__unsafe_unretained id safeself = self;

//ios 4

11 self.block = ^(nsstring *astring)

12);

在arc出現之前,我們可以自由的把cf*物件轉成ns*物件,這稱為自己橋接。用了arc之後,我們需要指定乙個所有權轉移修飾符。

目前arc中提供的修飾符有:

1.__bridge

2.__bridge_retained

3.__bridge_transfer

第乙個修飾符__bridge是乙個普通的轉換,表示不需要增加引用計數,不更改所有權。

第二個是在轉換c指標型別時,增加引用計數的值。

第三個是把core foundation 指標型別轉換成obj-c指標,變把引用計數值+1。如用core foundation 方法建立乙個物件,並且要用arc來管理物件的記憶體,就可以用這個。

arc移植的常見錯誤

1.強制轉換obj-c指標位c指標(或者反過來轉換)

2.在arc中把void*指標強制轉成id型別(或者反過來轉),如果要轉,就必須是用修飾符

例如: id selfpointer = (__bridge void *)self;

3.在結構體或者(union)集合體中是用obj-c物件

4.使用nsautoreleasepool

ios高效開發二 ARC跟block那點事

block是可以捕捉上下文的特殊 塊。block可以訪問定義在block外的變數,當在block中使用時,它就會為其在作用域內的每個標量變數建立乙個副本。如果通過self擁有乙個block,然後又在block中改變了例項變數,就會出錯。例如 1 self.block nsstring astring...

iOS應用開發 ARC

arc是什麼 arc是ios 5推出的新功能,全稱叫 arc automatic reference counting 簡單地說,就是 中自動加入了retain release,原先需要手動新增的用來處理記憶體管理的引用計數的 可以自動地由編譯器完成了。該機能在 ios 5 mac os x 10....

iOS 開發,混合使用 ARC 和非ARC

前提知識 arc automatic reference counting,自動引用計數 在開發 ios 3 以及之前的版本的專案時我們要自己負責使用引用計數來管理記憶體,比如要手動 retain release autorelease 等,而在其後的版本可以使用 arc,讓系統自己管理記憶體。問題...