iOS Block

193 阅读2分钟
  1. block 本质上是是一个oc对象,内部也有isa指针。这个对象内部封装了函数调用地址以及函数调用环境(参数参数、返回值、捕获的外部变量)

  2.  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
     }
    
  3.  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
    
  4. 全局变量不会捕获,直接访问

  5. 静态局部变量,捕获的是变量的地址,所以在block外面修改值以后,也会改变

  6. 普通变量,会直接捕获。外面在修改值,block内部是新生成了一个变量,不改变值

  7. _NSGlobalBlock_如果一个block里面没有访问普通局部变量,也就是没有捕获任何值,就是这种global类型,存在数据区。继承链:_nsgloableblock_ :nsblock:nsobject

  8. 如果一个block里面访问了普通局部变量,那他就是一个_nsstackblock_,他在内存中存放在栈区,特点是其释放不受开发者控制,都是系统操作,如果对他惊醒了copy,就会把这个block复制到堆上。