arc下的block簡述

2021-07-01 22:43:37 字數 1022 閱讀 9378

理解block的核心就在於:

當block只使用變數的值時,那麼只需要將變數的值作為實參傳給block中的形參。

如果這個變數是乙個指向某個物件的指標,那麼block是strong持有這個物件的。

nsarray *array = @[10];

void (^block)() = ^ ;

當block中會改變變數的值時,那麼需要將變數的位址(即指向變數的指標)作為實參傳給block中的形參。此時這個變數需要用__block修飾。

__block nsarray *array = @[10];

void (^block)() = ^ ;

另外,要了解的就是

如果block是在棧上建立的,那麼當出了作用域之後block就會被銷毀,其自然也就不會再strong持有物件了。

但是如果將block copy到了堆上,那麼就有問題了。

如果乙個物件有乙個block成員變數,而這個block中又使用到了self,那麼這兩個物件互相引用,便會產生記憶體洩露。

typedef void(^block)();

@property (nonatomic, copy, readwrite) block block;

self.block = ^;

處理這個問題的方法就是:

__weak __typeof(self) *weakself = self;

self.block = ^;

為什麼這樣處理就沒有問題了呢?

因為block中使用到的是乙個weak弱引用物件的指標,這樣block就也不會去strong持有這個物件,自然就沒有記憶體洩露的問題了。

可是,strongself又是做什麼的呢?strongself是保證一旦進入block之後,self就不能再被釋放直到block塊結束。

另外,要說明的一點是,不僅要考慮互相引用,也要考慮迴圈引用。

非ARC下返回Block

首先,對於沒有引用外部變數的block,無論在arc還是非arc下,型別都是nsglobalblock,這種型別的block可以理解成一種全域性的block,不需要考慮作用域問題。同時,對他進行copy或者retain操作也是無效的,比如這樣乙個返回block的函式 typedef int mybl...

iOS 非ARC下返回Block

首先,對於沒有引用外部變數的block,無論在arc還是非arc下,型別都是 nsglobalblock 這種型別的block可以理解成一種全域性的block,不需要考慮作用域問題。同時,對他進行copy或者retain操作也是無效的,比如這樣乙個返回block的函式 typedef int myb...

ARC和非ARC下使用Block屬性的問題

block屬性的宣告,首先需要用copy修飾符,因為只有copy後的block才會在堆中,棧中的block的生命週期是和棧繫結的。另乙個需要注意的問題是關於執行緒安全,在宣告block屬性時需要確認 在呼叫block時另乙個執行緒有沒有可能去修改block?這個問題,如果確定不會有這種情況發生的話,...