Block 的定義:
@property (nonatomic,copy)void(^myBlock)(int age);
Block 定義中copy關鍵字的使用:
1>使用 copy 關鍵字是把 block 拷貝到堆中,而棧中的 block 的生命周期是和棧綁定的. 使用 copy 是有可能在 block 代碼塊里面是用到一些本地變量.
2>如果使用 copy屬性,當其所在棧被釋放的時候,這些本地變量將變得不可訪問,一旦代碼執(zhí)行到block這段就會導致bad access;
3>在一個 block 中使用本地變量,如果聲名用assign,代碼執(zhí)行到block內(nèi)部就會出錯.
4>在 Objective-C 語言中嘹承,一共有 3 種類型的 block:
? ? ? ? ?_NSConcreteGlobalBlock 全局的靜態(tài) block倾哺,不會訪問任何外部變量呐能。
? ? ? ? ?_NSConcreteStackBlock 保存在棧中的 block泉褐,當函數(shù)返回時會被銷毀租冠。 ??
? ? ? ? ?_NSConcreteMallocBlock 保存在堆中的 block掸犬,當引用計數(shù)為 0 時會被銷毀跟匆。
5>在 block 中對于外部變量的應用:
? ? ? ? ?默認情況下,block 是將外部變量 copy 到其數(shù)據(jù)結構中來實現(xiàn)訪問的,
? ? ? ? ?使用__block 修飾外部變量引用,block 是復制其引用地址來實現(xiàn)訪問的.
block循環(huán)引用問題:
形成原因:
block引起的內(nèi)存泄露問題,一般是由于在 block 中使用 self , self 持有當前對象, 當前對象持有 block, block 持有 self. ?造成循環(huán)引用,?
解決辦法:
把 block 引用的 self 修飾為弱引用.
__weak viewController*?blockSelf?=?self;