Block原理
當(dāng)我們聲明一個(gè)block變量a并為它賦值時(shí)行嗤,其實(shí)就是創(chuàng)建一個(gè)函數(shù)指針ptrA,再根據(jù)block a賦值的代碼生成一個(gè)靜態(tài)函數(shù),而指針ptrA就指向這個(gè)靜態(tài)函數(shù)匀泊。block a調(diào)用時(shí)就是使用函數(shù)指ptrA調(diào)用生成的靜態(tài)函數(shù)烘绽。
獲取外部變量其實(shí)是在構(gòu)造__main_block_impl_0實(shí)例時(shí)傳進(jìn)去了并被保存敌卓,當(dāng)回調(diào)時(shí)通過把test(其實(shí)就是指向一個(gè)__main_block_impl_0實(shí)例)作為參數(shù)傳進(jìn)來瘟檩,通過它拿到了變量抹缕。這樣就實(shí)現(xiàn)了捕獲局部變量。當(dāng)block要捕獲多個(gè)變量時(shí)會(huì)是怎么的呢墨辛?其實(shí)不難猜卓研,有N個(gè)變量要被捕__main_block_impl_0結(jié)構(gòu)體中就會(huì)有N個(gè)變量用于保存,它的構(gòu)造函數(shù)就會(huì)有N個(gè)參數(shù)是用來傳這N個(gè)變量進(jìn)來保存睹簇∽嘧福回調(diào)時(shí)通過test(指向__main_block_impl_0實(shí)例)一一拿到
一開始我會(huì)猜想__block修飾的變量的值能在block代碼塊中被修改,不就是在第二部分中的傳一個(gè)變量值變成傳這個(gè)變量的地址進(jìn)去嗎太惠?其實(shí)這樣是有問題的磨淌,要明白如果這樣,就是相當(dāng)是傳了一個(gè)棧變量的地址進(jìn)去垛叨,函數(shù)結(jié)束這個(gè)地址就不可用了伦糯,編譯器才會(huì)給我們創(chuàng)建一個(gè)新的結(jié)構(gòu)__Block_byref_value_0
如下圖