block實現原理詳解

2021-07-02 14:36:29 字數 1272 閱讀 6388

對於大多數人來講,block內部到底是怎樣實現的呢?我們可以借助clang將其編譯成為c++的**,就可以看出,block到底是什麼東西,

先來看這樣乙個問題,

int age = 10;

void (^block)() = ^

; age = 30;

block();//10

以及下面的這一段**

__block int age = 10;

void (^block)() = ^

; age = 30;

block();//30

你會發現這兩個結果是不同的, 

第乙個輸出10,第二個輸出的是30

要想知道這裡面幹了些什麼!需要我們將其編譯成為c++**,看下裡面到底搞了些什麼? 

使用終端,轉到mian.m檔案下,使用如下** clang -rewrite-objc main.m 將其編譯生成 main.cpp檔案 

這時候,我們開啟mian.cpp便知 在檔案的最底下main函式中

int main(int argc, const char * argv)

;

void (*block)() = (void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_data, (__block_byref_age_0 *)&age, 570425344);

(age.__forwarding->age) = 30;

((void (*)(__block_impl *))((__block_impl *)block)->funcptr)((__block_impl *)block);

}return 0;

}block內部是呼叫了乙個結構體中的函式: 

static struct main_block_desc_0

然後經過分析該c++檔案我們知道 

block實際上是: 指向結構體的指標 

編譯器會將block的內部**生成對應的函式

而在mian.m中,呼叫普通的int變數時,傳過來的age其實是乙個值傳遞,而__block則是引用傳遞! 

所以,才是如上的結果!

這是對block的乙個基礎認識,再接下來的一篇部落格中,我講介紹一下mrc和arc使用block的區別 

希望能對讀者有用

block 實現原理詳解(一)

對於大多數人來講,block內部到底是怎樣實現的呢?我們可以借助clang將其編譯成為c 的 就可以看出,block到底是什麼東西,先來看這樣乙個問題,int age 10 void block age 30 block 10 以及下面的這一段 block int age 10 void block...

Block中 block實現原理

三.block中 block實現原理 我們繼續研究一下 block實現原理。1.普通非物件的變數 先來看看普通變數的情況。import int main int argc,const char ar myblock return 0 把上述 用clang轉換成原始碼。struct block byr...

Block實現原理

import int main int argc,const char argv i 3 myblock return 0 執行結果 i的值是 2為什麼是2 不是3呢?帶著這個疑問我們往下看 編譯main.m檔案,1.開啟終端,2.找到工程檔案,3.找到main.m檔案所在的位置,4.clang r...