内存管理
- 当block在栈上时,并不会对__block/__weak变量产生强引用
- 当block被copy到堆上时
- 会调用block内部的copy函数
- copy函数内部会调用 _Block_object_assign 函数 (__block变量/OC对象 传入参数不同)
- _Block_object_assign 函数会对__block变量形成强引用 (retain);对__weak变量形成弱引用
- 当block从堆中移除时
- 会调用block内部的dispose函数
- dispose函数内部会调用 _Block_object_dispose 函数 (__block变量/OC对象 传入参数不同)
- _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); } }
阅读量
loading...