在 swift 中经常使用 Closures, 但有的时候使用 Closures 会造成一些不可避免的问题, 比如没有使用 [weak self] 导致的循环引用问题. 即在 Closures 中持有 self 的强引用, 而 self 又对该 Closures 的拥有者有同样的强引用, 这样一来就会造成一个引用循环. 有时在无意间就会出现这个问题.
实际测试的过程中有如下的办法来检测循环引用:
- 使用自带的 Instruments 工具, 利用 Leak 配置进行检测.
- 在每个 Closure 使用的时候如果要用 self, 都加上
[weak self]
- 在每个对象的 deinit 中打印信息, 如果在应当销毁的时候没调用 deinit, 则证明该对象被循环引用了(特别是在从一个控制器中建立了另外一个控制器然后 push 到导航栈顶的这种场景下, 本条办法尤其简单有效, 因为如果出栈后的控制器没有被释放, 可能会导致很多资源都没有被释放, 而打印一条信息可以清晰看到这个控制器是否被销毁了.).