Blocks 模式
Block語法
- ^ 返回值類型 參數(shù)列表 表達式
- ^ 參數(shù)列表 表達式 (省略返回值類型)
- ^ 表達式 (省略參數(shù)列表)
Block變量類型
- 自動變量: 返回值類型 (^類型名稱)(參數(shù)列表)
- 函數(shù)參數(shù): 返回值類型 (^類型名稱)(參數(shù)列表) 返回值參數(shù): ^類型名稱()(參數(shù)列表) 使用typedef 更方便
- 參考
Blocks的實現(xiàn)
Block的實質
- __main_block_impl_0(__main_block_func_0,__main_block_desc_0_DATA)
- blik = __main_block-impl_0
- blk->FuncPtr
自動獲取外部變量
- 通過參數(shù)值傳遞到__main_block_impl_0獲取
__block說明符
- __Block_byref_intValue_0結構體:封裝__block修飾的外部變量
- _Block_object_assign函數(shù):當block從椙拷貝到堆時丁逝,調用
- _Block_object_dispose函數(shù):當block從堆內存釋放時,調用此函數(shù)
Block 存儲域
- _NSConcertStackBlock(棧) _NSConcertGlobalBlock(程序的數(shù)據(jù)區(qū)域.data區(qū)) _NSConcertMallocBlock(堆)
- block 作為方法或函數(shù)的參數(shù)傳遞時论咏,編譯器不會自動調用 copy 方法;
- 當block作為函數(shù)返回值返回時慧邮,編譯器將block作為_Block_copy函數(shù)
- 當 block 被賦值給 __strong id 類型的對象或 block 的成員變量時癌压,編譯器自動將 block 作為 _Block_copy
- 當 block 作為參數(shù)被傳入方法名帶有 usingBlock 的 Cocoa Framework 方法或 GCD 的 API 時衙荐。這些方法會在內部對傳遞進來的 block 調用 copy 或 _Block_copy 進行拷貝;
__block變量的內存管理
- 當Block從棧復制到堆時,使用的所有__block變量也從棧復制到堆希柿,此時block持有__block變量
- __forwarding:不管__block變量在棧上還是堆上秒际,都能正確的訪問該變量
截獲對象
- 當 block 調用 copy 方法時悬赏,如果 block 在棧上,會被拷貝到堆上娄徊;
- 當 block 作為函數(shù)返回值返回時闽颇,編譯器自動將 block 作為 _Block_copy 函數(shù),效果等同于 block 直接調用 copy 方法寄锐;
- 當 block 被賦值給 __strong id 類型的對象或 block 的成員變量時兵多,編譯器自動將 block 作為 _Block_copy 函數(shù),效果等同于 block 直接調用 copy 方法橄仆;
- 當 block 作為參數(shù)被傳入方法名帶有 usingBlock 的 Cocoa Framework 方法或 GCD 的 API 時剩膘。這些方法會在內部對傳遞進來的 block 調用 copy 或 _Block_copy 進行拷貝;