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大小

 

未完待續函數

相關文章
相關標籤/搜索