iOS细节篇-block循环引用问题,和block安全使用方法

iOS细节篇-block循环引用问题,和block安全使用方法

什么时候block循环引用

循环引用是什么这里就不解释了
在我平时开发中遇到block循环引用问题要满足一下两个条件
1.定义一个block作为属性定义的类
2.在实现block的类中使用了,强引用的成员变量(self.XXX)
满足上面两种情况就会循环引用,会造成循环引用,内存就会泄漏。
循环引用图

怎么解决循环引用

了解了循环引用原理就大概知道了怎么解决它。
方案一
__weak typeof (self) weakSelf = self;
方案二
__unsafe_unretained typeof (self) weakSelf *weakSelf = self;
这两种方案都是断掉循环引用链。
第一种和第二种区别在于当 引用对象为nil时weak的指向会指向nil指针,而__unsafe_unretained还是指向原来的内存。
所以说我们开发的时候只要用weak就好了__unsafe_unretained这个就是装逼的没什么大用处。

怎么样安全使用

在满足
1.定义一个block作为属性定义的类
2.在实现block的类中使用了,强引用的成员变量(self.XXX)
的情况下用
__weak typeof (self) weakSelf = self;
然后要在block中用__strong

    __weak typeof (self) weakSelf = self; 
    model.block = ^(){
    __strong typeof (weakSelf) strongSelf = self;
        XXXXXX
    }

在里面是用__strong的原因是因为防止block在执行的时候外部的self对象被释放掉了。这时候block内部的weakSelf就会为nil。所以block内部要有一个强指针指向self对象,当block代码执行完了之后释放。这里__strong可以省略(系统默认),为了可读性可以写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值