闭包和静态函数

Closures and static funcs

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

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

这个classviewModel被实例化,然后viewModel.getUserSettings()被调用。这种方法正在调用一个 static 方法 UserSettings.getInfo,该方法传递一个 @escaping 闭包以作为完成调用。该闭包正在捕获 viewModel(它在其主体内使用 self)。

  1. 调用 static 方法对内存有什么影响?未实例化的 UserSettings class 怎么会是 "deallocated"?

  2. 在这种特定情况下会发生强引用循环吗?如果是,应该如何捕获selfweakstrong

What consequences does calling a static method have in terms of memory? How would that UserSettings class that is not instantiated be "deallocated"?

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

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

Could a strong reference cycle happen in this particular scenario? If so, how should self be captured: weak or strong?

根据 getInfo 内发生的情况,这可能会造成引用循环。虽然这似乎不太可能,但您发布的代码片段无法确定。

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

最后,为了形象化您当前的方法,您可以按以下方式考虑它:

UserSettingsManagerclosureself

那是一条漂亮干净的链条!仅当其中一个链接获得对另一个链接的引用时,才会发生引用循环。