iOS底层原理 - Block的引用情况

655 阅读1分钟
  • 当block内部访问了对象类型的auto变量时:
        MYBlock block;
        {
            // 默认是auto修饰
            MYPerson *person = [[MYPerson alloc] init];
            person.age = 10;
            block = ^{
                NSLog(@"---------%d", person.age);
            };
        }
       NSLog(@"------");
  • 如果block是在栈上的(访问了auto变量的block),将不会对auto变量产生强引用 ;
  • 如果block是在堆上(严格来说是栈上的block进行了copy操作,才变成了堆上的):
  1. 会调用block内部的copy函数;
  2. copy函数内部会调用_Block_object_assign函数;
  3. _Block_object_assign函数会根据auto变量的修饰符(__strong__weak__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用。
  • 如果block从堆上移除:
  1. 会调用block内部的dispose函数;
  2. dispose函数内部会调用_Block_object_dispose函数;
  3. _Block_object_dispose函数会自动释放引用的auto变量(release)。