其内存图如下
这种写法等价于下面的写法
_weak:不会产生强引用
_unsafe_unretained:不会产生强引用,不安全
如果是_weak修饰,当指向的对象销毁了,会自动把保存的地址值置为nil,而_unsafe_unretained修饰,指向的对象就算销毁了,也不会把保存的地址置为nil的。
//MRC是不支持_weak的
__weak typeof(self) weakSelf = self;
self.someBlock = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
[self doSomething];
}
在block外部使用weakSelf定义self的弱引用对象,然后在block内部对weakSelf进行一次强引用(防止执行到block块中代码的时候self被提前释放导致weakSelf为nil),由于strongSelf定义为局部变量,当其作用域结束后,strongSelf自动释放对self的强引用,从而避免了retain cycle。
person要是没有调用test方法,person是会正常释放的,要是person调用了test方法,不管有没有调用里面的block,person都不会正常释放,因为有循环引用
对应上图
网友评论