代码之家  ›  专栏  ›  技术社区  ›  Woodstock

GCD中的弱Self,访问Self的TableView属性

  •  0
  • Woodstock  · 技术社区  · 4 年前

    我看到很多这样的代码:

    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
    

    在这种情况下,在哪里 tableView 是的财产 self 我们应该确保 weak self 是这样捕捉的:

    DispatchQueue.main.async { [weak self] in
        self?.tableView.reloadData()
    }
    

    我想是的,但是这种“不安全”的代码在代码库中无处不在,我想知道我是否遗漏了什么?

    0 回复  |  直到 4 年前
        1
  •  5
  •   Rob Md Fahim Faez Abir    4 年前

    你说:

    在这种情况下,在哪里 tableView 是的财产 self 我们应该确保 weak self 是这样捕捉的:

    DispatchQueue.main.async { [weak self] in
        self?.tableView.reloadData()
    }
    

    weak 参考 自己 虚弱的 引用)是指它将保留对 自己 直到调度的块完成运行。但这种关闭通常会立即进行,稍纵即逝的强引用将很快被消除。

    因此,不,你不必使用 虚弱的 此处引用。这样做在技术上并不是不正确的,但是添加了一个语法噪音,实际上没有任何好处。是的,我们应该努力打破潜在的强参考循环 虚弱的 参考文献,但这不是其中之一。


    顺便说一句,不安全这个词的选择有点把话题搞糊涂了。在谈到内存引用时,“不安全”有一个非常具体的含义:它通常指在不使用运行时安全检查时挂起对已释放对象的引用。作为 The Swift Programming Language: Automatic Reference Counting 说(强调原文):

    Swift还提供 不安全的

    您可以通过书写来指示不安全的无主引用 unowned(unsafe) . 如果在释放引用的实例后尝试访问不安全的无主引用,则程序将尝试访问该实例以前所在的内存位置,这是一个不安全的操作。

    显然,强引用和弱引用都是安全的(前者防止对象被释放,后者将其引用设置为 nil unowned 引用通常使用运行时安全检查(尽管如果使用 无主 对象释放后的引用)。不安全的引用用于高性能场景,在这种场景中,您完全有信心无主引用得到正确处理,并且愿意在没有运行时安全检查的情况下运行代码。

    我怀疑你在这个上下文中不是指不安全,但是我提到它是为了让你知道这个词在ARC和内存管理上下文中的具体含义。