OC

block的内存管理&循环引用

Posted on 2021-05-10,2 min read

内存管理

  • 当block在栈上时,并不会对__block/__weak变量产生强引用
  • 当block被copy到堆上时
    1. 会调用block内部的copy函数
    2. copy函数内部会调用 _Block_object_assign 函数 (__block变量/OC对象 传入参数不同)
    3. _Block_object_assign 函数会对__block变量形成强引用 (retain);对__weak变量形成弱引用
  • 当block从堆中移除时
    1. 会调用block内部的dispose函数
    2. dispose函数内部会调用 _Block_object_dispose 函数 (__block变量/OC对象 传入参数不同)
    3. _Block_object_dispose 函数会自动释放引用的__block/__weak变量 (release)

循环引用

  • 循环引用示例

    person对象不会释放,因为person对象持有着block,block又强引用着person对象;

    {
        MJPerson *person = [[MJPerson alloc] init];
        person.age = 10;
        person.block = ^{
            NSLog(@"%d",person.age);
        };
    }
    // 作用域结束后,person并不会被释放
    

    此例子self对象本身也不会被释放,self本身实际上是一个局部变量,是作为参数传递进方法里的,循环引用的原理同上;(_age 实际上是 self->_age,同样引用了self)

    -(void)test{
        self.block = ^{
            NSLog(@"age is %d - %d", self.age, _age); 
        }
    }
    

下一篇: block的本质→

loading...