Block(六)内存管理与循环引用

之前的Block系列文章,我们已经对Block的方方面面都作了阐述,但是针对内存管理,我们还有最后一个需要讨论的话题——循环引用。

本文将会针对循环引用做一个讨论,同时,将会对Block涉及的内存管理做一个总结。

本文源码–循环引用

一、循环引用

1.1 自循环引用

Block内调用对象,对象拥有Block,导致产生的双向强引用——循环引用。

对象自循环引用

解决方法,就是打破该循环,利用__weak__unsafe_unretained来打破该循环。

  • __weak:不会产生强引用,指向的对象销毁时,会自动让指针置为nil。

  • __unsafe_unretained:不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变,也就是僵尸对象。

1.2 __block导致的循环引用

使用__block导致产生的三角强引用——循环引用。

__block导致的循环引用

打破该三角循环,我们主动将person对象,在Block内部置为nil,但是需要主动调用执行Block

二、内存管理

下面总结了,捕获变量和内存管理的Block内如何处理。

block的内存管理

到此,Block的部分,我们已经讲述完了。

参考

示例代码

  1. 循环引用