美文网首页swift
swift 解决循环引用的三种方法

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

作者: biubiu15 | 来源:发表于2018-07-26 11:53 被阅读0次
    方法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 比较厉害, 但是玩不好, 野指针会让你哭, 慎用, 慎用)

    相关文章

      网友评论

        本文标题:swift 解决循环引用的三种方法

        本文链接:https://www.haomeiwen.com/subject/mmavmftx.html