swift - 闭包和静态函数

标签 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. 在此特定场景中是否会出现强引用循环?如果是,应该如何捕获 self:weak 还是 strong

最佳答案

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 ,这是默认设置。这意味着闭包会增加 self 实例的强引用计数,以便它可以在最终调用闭包时成功地与该实例交互。要覆盖此行为并避免引用循环,您可以使用 [weak self]

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

UserSettingsManagerclosureself

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

关于swift - 闭包和静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51235011/

相关文章:

ios - 在没有按钮的情况下选择选项选择/关闭 UIPickerView 时更新文本字段?

ios - 我如何在 ReactiveCocoa 5 中将 RACDisposable 转换为 Disposable?

ios - swift : Switching tableview cells in cellForRowAtIndexPath

c - mruby 中的最小静态编译

php - 静态方法和继承中的get_class (php)

Javascript:调用存储在变量中的方法

ios - 错误 : Unable to load contents of file list: '/Target Support Files/Pods-xx/Pods-xx-frameworks-Debug-input-files.xcfilelist' (in target 'xx' )

java - 在静态方法中获取实际泛型类型的类对象

swift - 为什么闭包在 Swift 3 中默认都是非转义的而需要显式的 `self`?

ios - 为什么从闭包返回的变量总是落后一步