源**:
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,定義...