iOS开发你需要知道的iOS 知识收集

iOS底层学习16 -- block循环引用问题

2020-09-01  本文已影响0人  恋空K
block属于要是copy修饰的,给这个block属性赋值的时候,会对右边的block会进行一次copy操作,copy到堆上去,当然如果block属性用strong修饰,也会将右边的block copy到堆上去的,强引用block,block也是会copy到堆上的,不过我们一般建议用copy修饰,这样不管是MRC还是ARC这个写法都是一致的
其内存图如下


这种写法等价于下面的写法


_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都不会正常释放,因为有循环引用
对应上图
上一篇 下一篇

猜你喜欢

热点阅读