swift是支持ARC的,所以我们一般不需要管理内存,但是无意出现的循环引用导致内存无法释放出现内存泄漏。
下面说说循环引用的出现和解决。
1. 类实例的循环引用之 weak 破解
简单的说就是两个类的属性相互持有了对方的实例,这是系统系统释放后,因为属性的强持有导致无法释放,造成内存泄漏。示例:
这时就造成了循环引用,这时我们试着将两个实例都释放,看下会出现什么情况:
我们看到即便是我们同时释放了这两个实例,因为属性的相互强持有导致无法释放对方,下面我们看看解决方案:
我们只要对其中任何一个用weak修饰,就可以打破这个引用循环
2. 类实例的循环引用之 Unowned 破解
Unowned(无主引用)无主引用的值总是存在或者由自己赋为nil,ARC不会主动将Unowned修饰的赋值为nil。
3. 闭包的循环引用
闭包的循环引用一般是在闭包内捕获了实例主体(self),从而导致了循环引用,如下所示:
破解:
或者对delegate进行weak修饰
今天简要记录