block 中强引用与弱引用

在项目学习的时候,遇到 block 内部使用强引用还是弱引用的一些内存问题,总结记录一下。

创建一个测试 demo,包含一个普通的 person 类


里面声明了一个字符串name 属性, 和一个 block 属性。
另外,为了监测 person 对象是否被释放,在XFPerson.m 加上一段测试代码

接着来到ViewController.m, 引入 person 类头文件,实例化一个 person 对象。
我们来看以下这几种情况:

block 内部没有使用外部变量

给name 和 block 赋值



可以看到代码执行完毕,block 内容被输出,person 对象被正常释放

block 内部使用外部声明的强引用访问person 对象在 block 内部访问 person 的name 属性


可以发现,代码执行完毕后,block 内容被输出,但并没有发现 person 对象被正常释放,此时会产生内存问题。

block 内部使用外部声明的弱引用访问person 对象在 block 内部使用外部声明的弱引用访问person对象


代码执行完毕后,可以看到 person 对象被正常释放。
可能你会说,以后内部就使用外部声明的弱引用不就可以了,但是,你再看这种情况

这时候你会发现,在打印 block 内容的之前,person 对象已经被释放了,自然,name 属性的值,也是空的了。

block 内部有延迟操作的时候,使用外部声明的强引用

这种情况是针对上面那个测试的,就是在延操作的时候,直接使用外部声明强引用



这个时候,确实可以访问到 person 对象的name 属性值,但是,同样像最开始一样,block 会对 person 对象产生强引用,代码执行完毕后 person 对象没有被正常释放,导致内存问题。
那么该怎么解决呢? 再看下面这种情况

block 内部使用内部声明的强引用

在 block 内部声明一个强引用指向外部声明的若引用,话可能有点绕,我们来看结果



可以看到,person 的 name 属性值被打印出来,而且,person 对象也被正常释放。

总结:
如果【block内部】使用了【外部声明的强引用】访问【对象A】,那么【block内部】会自动产生于一个【强引用】指向【对象A】
如果【block内部】使用了【外部声明的弱引用】访问【对象A】,那么【block内部】会自动产生于一个【弱引用】指向【对象A】

推荐阅读更多精彩内容

  • Ping++SDK:一次申请开通多个支付渠道,一次接入所有平台和支付方式 需要传递三个参数:api key应用id...
    BURIBURI_ZAEMON阅读 1,957评论 0 11
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 673评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 3,579评论 0 12
  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 1,642评论 2 28
  • block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实...
    松鼠Mr阅读 282评论 0 1