我们正在就如何避免在封闭中保留周期的最佳方法进行辩论。我们正在讨论以下两种方法。
func getStock() { [weak self] (stock)in
self?.dismissActivityIndicator()
}
vs
func getStock(){ [weak self] (stock) in
guard let strongSelf = self else { return }
strongSelf.dismissActicityIndicator()
}
其中一个比另一个更好或更安全吗?为什么?如果有帮助,我们的讨论基于多线程方案。
答案 0 :(得分:0)
实际上,这两种方法没有区别。
如果self?.
是self
以及nil
,则可选链guard let ... else {
会退出闭包
答案 1 :(得分:0)
对于简单的闭包(如您的单行示例),两种方法之间确实没有区别;因此,具有较弱引用的变体可以被认为是“更好”的,因为它更易于阅读,占用的行数少(但最终还是要随口味而定)。
当关闭变得复杂时,第二种方法更具确定性:您可以在闭包内部调用另一个异步方法,并从嵌套回调块内部访问strongSelf
,并确保该对象仍然存在;如果self
较弱,则有可能在嵌套回调运行之前释放对象。
强大的力量伴随着巨大的责任;用武力保持物体不总是您想要的-例如当self
是UIViewController
时,不将其保留在回调中可能只是希望的行为:如果从视图层次结构中删除了VC,最好也丢弃任何待处理的后台操作的结果,而不是更新永远不会显示的UI。您甚至可以根据弱对象的存在来决定是否尽早取消后台工作。 (当然,除了示例之外,我不主张使用如此复杂的闭包。)