打破swift的循环引用

236 阅读1分钟

swift是支持ARC的,所以我们一般不需要管理内存,但是无意出现的循环引用导致内存无法释放出现内存泄漏。

下面说说循环引用的出现和解决。

1. 类实例的循环引用之 weak 破解

简单的说就是两个类的属性相互持有了对方的实例,这是系统系统释放后,因为属性的强持有导致无法释放,造成内存泄漏。示例:

image.png

这时就造成了循环引用,这时我们试着将两个实例都释放,看下会出现什么情况:

image.png

我们看到即便是我们同时释放了这两个实例,因为属性的相互强持有导致无法释放对方,下面我们看看解决方案:

image.png

我们只要对其中任何一个用weak修饰,就可以打破这个引用循环

image.png

2. 类实例的循环引用之 Unowned 破解

Unowned(无主引用)无主引用的值总是存在或者由自己赋为nil,ARC不会主动将Unowned修饰的赋值为nil。 image.png

3. 闭包的循环引用

闭包的循环引用一般是在闭包内捕获了实例主体(self),从而导致了循环引用,如下所示: image.png

image.png

破解:

image.png

image.png

或者对delegate进行weak修饰

image.png

今天简要记录

源文档见