block中对于变量的捕获分为三种: 值传递、指针传递和直接访问
值传递
block捕获的局部变量,用auto修饰的,auto一般省略
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { int age = 10; void (^block)(void) = ^{ NSLog(@"%d",age); }; block(); } return 0; }
转为C++代码如下:
struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int age; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _age, int flags=0) : age(_age) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } };
void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, age));
这种直接捕获的age的值,为值传递
指针传递
block捕获局部的静态变量
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { static int age = 10; void (^block)(void) = ^{ NSLog(@"%d",age); }; block(); } return 0; }
转为C++代码:
struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int *age; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int *_age, int flags=0) : age(_age) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } }; void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, &age));
直接获取
block捕获全局变量
#import <Foundation/Foundation.h> int age = 10; int main(int argc, const char * argv[]) { @autoreleasepool { void (^block)(void) = ^{ NSLog(@"%d",age); }; block(); } return 0; }
转C++代码如下:
struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } }; void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));