Block原理
当我们声明一个block变量a并为它赋值时,其实就是创建一个函数指针ptrA,再根据block a赋值的代码生成一个静态函数,而指针ptrA就指向这个静态函数。block a调用时就是使用函数指ptrA调用生成的静态函数。
获取外部变量其实是在构造__main_block_impl_0实例时传进去了并被保存,当回调时通过把test(其实就是指向一个__main_block_impl_0实例)作为参数传进来,通过它拿到了变量。这样就实现了捕获局部变量。当block要捕获多个变量时会是怎么的呢?其实不难猜,有N个变量要被捕__main_block_impl_0结构体中就会有N个变量用于保存,它的构造函数就会有N个参数是用来传这N个变量进来保存。回调时通过test(指向__main_block_impl_0实例)一一拿到
一开始我会猜想__block修饰的变量的值能在block代码块中被修改,不就是在第二部分中的传一个变量值变成传这个变量的地址进去吗?其实这样是有问题的,要明白如果这样,就是相当是传了一个栈变量的地址进去,函数结束这个地址就不可用了,编译器才会给我们创建一个新的结构__Block_byref_value_0
如下图