swift 解决循环引用的三种方法

方法1:OC 的方式

weak var weakSelf = self

注意:weak 只能修饰 var, 不能修饰 let
weak must be a mutable variable, because it may change at runtime
weak 可能会被在运行时被修改 -> 指向的对象一旦被释放, 会被自动设置为 nil


方法2: swift 推荐用法
     { [weak self] in
            print(self?.view as Any)
     }

注意 [weak self] 表示 {} 中的所有 self 都是弱引用, 需要注意解包


方法3: swift 的另一个用法, 了解就好
        { [unowned self] in
            print(self.view)
        }

注意:
[unowned self] 表示 {} 中的所有 self 都是 assign 的, 不会强引用, 但是, 对象释放, 指针地址不会发生变化, 如果对象释放后继续调用, 会出现野指针问题

另外 -- 复习一下 OC 解决循环引用的两种方法:

方法1: __weak (只能在 ARC 中使用, MRC 中没有 __weak)
__weak typeof(self) weakSelf = self;
在 swift 中的语法为👆方法2


方法2: __unsafe_unretained (ARC 和 MRC 都可以使用)
__unsafe_unretained typeof(self) unsafeSelf = self;
在 swift 中的语法为👆方法3


区别:

  • __unsafe_unretained 弱引用对象都用 assign 修饰, 不会增加引用计数. 但是对象被释放, 地址不会改变, 继续访问, 会引起野指针
  • __weak, 本质上是观察者模式, 一旦对象被释放后, 指针地址自动置为 nil, 更加安全
  • 效率: weak 效率上稍微差一些
  • (大神说 __unsafe_unretained 比较厉害, 但是玩不好, 野指针会让你哭, 慎用, 慎用)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容