理解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?這個問題,如果確定不會有這種情況發生的話,...