-
block 本质上是是一个oc对象,内部也有isa指针。这个对象内部封装了函数调用地址以及函数调用环境(参数参数、返回值、捕获的外部变量)
-
int age = 20; void (^block)(void) = ^{ nslog(@"age is %d",age) } struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_9 *desc int age } -
int c = 1000; // 全局变量 static int d = 10000; // 静态全局变量 int main(int argc, const char * argv[]) { @autoreleasepool { int a = 10; // 局部变量 static int b = 100; // 静态局部变量 void (^block)(void) = ^{ NSLog(@"a = %d",a); NSLog(@"b = %d",b); NSLog(@"c = %d",c); NSLog(@"d = %d",d); }; a = 20; b = 200; c = 2000; d = 20000; block(); } return 0; } // ***************打印结果*************** 2020-01-07 15:08:37.541840+0800 CommandLine[70672:7611766] a = 10 2020-01-07 15:08:37.542168+0800 CommandLine[70672:7611766] b = 200 2020-01-07 15:08:37.542201+0800 CommandLine[70672:7611766] c = 2000 2020-01-07 15:08:37.542222+0800 CommandLine[70672:7611766] d = 20000 -
全局变量不会捕获,直接访问
-
静态局部变量,捕获的是变量的地址,所以在block外面修改值以后,也会改变
-
普通变量,会直接捕获。外面在修改值,block内部是新生成了一个变量,不改变值
-
_NSGlobalBlock_如果一个block里面没有访问普通局部变量,也就是没有捕获任何值,就是这种global类型,存在数据区。继承链:_nsgloableblock_ :nsblock:nsobject
-
如果一个block里面访问了普通局部变量,那他就是一个_nsstackblock_,他在内存中存放在栈区,特点是其释放不受开发者控制,都是系统操作,如果对他惊醒了copy,就会把这个block复制到堆上。