闭包和静态函数

时间:2018-07-08 18:40:19

标签: swift static closures retain-cycle

我有一个ViewModel类,其方法如下:

func getUserSettings() {
   UserSettingsManager.getInfo { (result, error) in
     if error == nil {
        self.userData = result
     }
   }
}

实例化此类viewModel,然后调用viewModel.getUserSettings()。这种方法正在调用static方法UserSettings.getInfo,该方法通过@escaping闭包被称为完成。该闭包正在捕获viewModel(它是在体内使用self)。

  1. 调用static方法对内存有什么影响?未被实例化的UserSettings类将如何“取消分配”?

  2. 在这种特定情况下会发生强大的参考周期吗?如果是这样,应该如何捕获selfweakstrong

1 个答案:

答案 0 :(得分:1)

  

调用静态方法在以下方面有什么后果?   记忆?未实例化的UserSettings类将如何处理   “已分配”?

在您的问题上下文中,该函数为静态这一事实没有任何特殊的内存含义。静态方法与非静态方法一样具有创建参考循环的潜力。

如您所说,如果没有UserSettingsManager的实例,则不会释放任何实例。单凭这一事实并不能消除参考周期的可能性。

  

在这种特定情况下会发生强大的参考周期吗?如果是这样,应该如何捕捉自我:弱者还是强者?

根据getInfo中发生的情况,这可能会创建一个参考周期。虽然似乎不太可能,但是无法肯定地说出您发布的摘录。

为澄清起见,我应该提到您当前正在强烈捕捉自我,这是默认设置。这意味着闭包会增加self实例的强引用计数,以便在最终调用闭包时它可以与该实例成功交互。要覆盖此行为并避免引用周期,请使用[weak self]

最后,要形象化您当前的方法,您可以通过以下方式考虑它:

UserSettingsManagerclosureself

那是一个很好的清洁链!仅当这些链接中的一个获得了另一个参考时,才会发生参考循环。