Block 5 Block解析之截獲區域性變數值

2021-06-21 22:06:16 字數 2303 閱讀 1354

源**:

int main(int argc, const char * argv)

; val = 2;

fmt = "these values were changed. val = %d\n";

blk();

return 0;

}

將上面的源**用命令:

「clang -rewrite-objc main.c」

轉換為c++

**如下:

struct __main_block_impl_0 

};static void __main_block_func_0(struct __main_block_impl_0 *__cself)

static struct __main_block_desc_0 __main_block_desc_0_data = ;

int main(int argc, const char * argv)

這與前面轉換的源**稍有差異。下面來看看其中的不同這處。首先我們注意到,block語句中使用的區域性變數被作為成員變數追加到了__main_block_impl_0結構體中。

struct __main_block_impl_0

__main_block_impl_0結構體內宣告的成員變數型別與區域性變數型別完全相同。請注意,block語句中沒有使用的區域性變數不會被追加,如此源**中的變數dmy。blocks的區域性變數截獲只針對block中使用的區域性變數。下面來看看初始化該結構體例項的建構函式的差異。

void (*blk)(void) = (void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_data, fmt, val);

使用執行block語法時的區域性變數fmt和val來初始化__main_block_impl_0結構體例項。

即在該源**中,__main_block_impl_0結構體例項的初始化如下:

impl.isa = &_nsconcretestackblock;

impl.flags = flags;

impl.funcptr = fp;

desc = __main_block_desc_0_data;

fmt = "val = %d\n";

val = 10;

由此可知,在__main_block_impl_0結構體例項(即block)中,變數值被截獲。

下面再來看一下使用block的匿名函式的實現。最被源**的block語法如下所示:

printf(fmt, val);

該源**可轉換為以下函式:

static void __main_block_func_0(struct __main_block_impl_0 *__cself)

在轉換後的源**中,截獲到__main_block_impl_0結構體例項的成員變數上的區域性變數,這些變數在block語法表示式之前被宣告定義。因此,原來的源**表示式無需改動便可使用截獲的區域性變數值執行。

總的來說,所謂「截獲區域性變數值」意味著在執行block語法時,block語法表示式所使用的區域性變數值被儲存到block的結構體(即block自身)中。

然而,block不能直接使用c語法陣列型別的區域性變數。如前所述,截獲區域性變數時,將值傳遞給結構體的建構函式進行儲存。

下面確認在block中利用c語法陣列型別的變數時有可能使用到的源**。首先來看將陣列傳遞給block的結構體建構函式的情況。

void func(char a[10]) 

int main() ;

func(a);

}

該源**可以順利編譯,並正常執行。在之後的建構函式中,將引數賦給成員變數中,這樣在變換了block語法的函式內可由成員變數賦值給區域性變數。源****如下。

void func(char a[10])

int main() ;

func(a);

}

該源**將c語言陣列型別變數賦值給c語言陣列型別變數中,這是不能編譯的。雖然變數的型別以及陣列的大小都相同,但c語言規範不允許這種賦值。當然,有許多方法可以截獲值,但blocks似乎更遵循c語言規範。

}

iOS開發之block解析

1.block的本質是乙個objective c的物件。為什麼這麼說?在objective c中。runtime會在執行時依據物件的isa指標的指向,來度額定這個物件的型別。也能夠覺得乙個物件。它具有isa指標。就是乙個oc物件 2.你怎麼知道block有isa指標呢。我們能夠通過clang命令將來...

Block用法解析

block 塊是對c做出的乙個補充,初次體驗 塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給 帶來層次上的提公升。block就是一段在將來被執行的 塊返回值型別 形參型別1 形參1,形參型別2 形參2,塊返回值型別 塊變數名 形參型別1,形參型別2,定義...

Block用法解析

block 塊是對c做出的乙個補充,初次體驗 塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給 帶來層次上的提公升。block就是一段在將來被執行的 塊返回值型別 形參型別1 形參1,形參型別2 形參2,塊返回值型別 塊變數名 形參型別1,形參型別2,定義...