block內部實現原理(一)


【block 定義】

  block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴展,用來實現匿名函數的特性。

【block 結構】

 

【block原理】
1.一個簡單block


以一個簡單block為例, Clang提供了中間代碼展示的選項供我們進一步了解block的原理。
在Terminal, 使用-rewrite-objc選項編譯:
得到一份main.cpp文件,open這份文件中可以看到如下代碼片段:
從命名可以看出這是block的實現,並且得知block在Clang編譯器前端得到實現,可以生成C中間代碼。

2 . 首先,返回值類型 (void (*)() 空指針,
參數__main_block_func_0,參數&__main_block_desc_0_DATA,以及用來調用的__main_block_impl_0。
__main_block_func_0是一個函數,__main_block_desc_0_DATA,__main_block_impl_0則是一個結構體,
生成的代碼片段如圖:


所以說 實際上block就是指向結構體的指針
__main_block_impl_0中包含了兩個成員變量和一個構造函數,成員變量分別是__block_impl結構體和描述信息Desc,之后在構造函數中初始化block的類型信息和函數指針等信息。
 接着出現的是__main_block_func_0函數,即block對應的函數體。該函數接受一個__cself參數,即對應的block自身。
 再下面是__main_block_desc_0結構體,其中比較有價值的信息是block大小。
main函數在最后,最后就是main函數中對block的創建和調用,可以看出執行block就是調用一個以block自身作為參數的函數,這個函數對應着block的執行體 
這里,block的類型用_NSConcreteStackBlock來表示,表明這個block位於棧中。同樣地,還有_NSConcreteMallocBlock和_NSConcreteGlobalBlock。

3.  從上面代碼看出,
isa指針:指向表明該block類型的類。
flags:按bit位表示一些block的附加信息,比如判斷block類型、判斷block引用計數、判斷block是否需要執行輔助函數等。
funcPtr: 是block對應的函數指針
desc:block的附加描述信息,比如保留變量數、block的大小、進行copy或dispose的輔助函數指針。
reserved:保留變量,我的理解是表示block內部的變量數。
size: block大小

 

未完待續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM