避免使用弱的自我保留闭合中的循环

时间:2018-07-14 17:39:46

标签: ios swift closures retain-cycle

我们正在就如何避免在封闭中保留周期的最佳方法进行辩论。我们正在讨论以下两种方法。

    func getStock() { [weak self] (stock)in
       self?.dismissActivityIndicator()
    }

vs

    func getStock(){ [weak self] (stock) in
      guard let strongSelf = self else { return }
      strongSelf.dismissActicityIndicator()
    }

其中一个比另一个更好或更安全吗?为什么?如果有帮助,我们的讨论基于多线程方案。

2 个答案:

答案 0 :(得分:0)

实际上,这两种方法没有区别。

如果self?.self以及nil,则可选链guard let ... else {会退出闭包

答案 1 :(得分:0)

对于简单的闭包(如您的单行示例),两种方法之间确实没有区别;因此,具有较弱引用的变体可以被认为是“更好”的,因为它更易于阅读,占用的行数少(但最终还是要随口味而定)。

当关闭变得复杂时,第二种方法更具确定性:您可以在闭包内部调用另一个异步方法,并从嵌套回调块内部访问strongSelf,并确保该对象仍然存在;如果self较弱,则有可能在嵌套回调运行之前释放对象。

强大的力量伴随着巨大的责任;用武力保持物体不总是您想要的-例如当selfUIViewController时,将其保留在回调中可能只是希望的行为:如果从视图层次结构中删除了VC,最好也丢弃任何待处理的后台操作的结果,而不是更新永远不会显示的UI。您甚至可以根据弱对象的存在来决定是否尽早取消后台工作。 (当然,除了示例之外,我不主张使用如此复杂的闭包。)