swift

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

2018-07-26  本文已影响0人  biubiu15
方法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 比较厉害, 但是玩不好, 野指针会让你哭, 慎用, 慎用)
上一篇 下一篇

猜你喜欢

热点阅读