Ios 避免使用弱自变量在闭包中保留循环

Ios 避免使用弱自变量在闭包中保留循环,ios,swift,closures,retain-cycle,Ios,Swift,Closures,Retain Cycle,我们正在进行一场辩论,讨论什么是避免在结束时保持循环的最佳方法。我们在讨论以下两种方法 func getStock() { [weak self] (stock)in self?.dismissActivityIndicator() } vs 其中一个比另一个更好还是更安全?为什么?我们的讨论基于多线程场景(如果有帮助的话) 实际上,这两种方法没有区别 func getStock() { [weak self] (stock)in self?

我们正在进行一场辩论,讨论什么是避免在结束时保持循环的最佳方法。我们在讨论以下两种方法

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


其中一个比另一个更好还是更安全?为什么?我们的讨论基于多线程场景(如果有帮助的话)

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

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

如果
self
nil
以及
guard let,
。。。否则{

对于简单闭包,就像您的单行示例一样,这两种方法之间实际上没有区别;因此带有弱引用的变体可以被认为是“更好的”,因为它更容易阅读,并且只需要少一行(但最终这是一个品味问题)

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


然而,强大的力量带来了巨大的责任;通过强制保持对象的活动性并不总是你想要的——例如,当
self
UIViewController
时,不将其保留在回调中可能是你想要的行为:如果VC被从视图层次结构中删除,那么最好也放弃结果除了更新一个永远不会显示的UI之外,您还可以根据弱对象的存在来决定是否提前取消后台工作。(当然,我不主张使用如此复杂的闭包,只是为了举例。)

我也是这么想的,但当闭包中有多个语句时,事情会变得更棘手。如果一个操作修改了self,那么另一个操作在self?的情况下会知道。但是,如果是guard let strongSelf,即使其中一个操作更改了self,strongSelf也不会更改。我知道这听起来很混乱,我可以试着把它放进去代码在这里,我不知道如何在这里的评论代码。