Swift 闭包与静态函数

Swift 闭包与静态函数,swift,static,closures,retain-cycle,Swift,Static,Closures,Retain Cycle,我有一个ViewModel类,其方法如下: func getUserSettings() { UserSettingsManager.getInfo { (result, error) in if error == nil { self.userData = result } } } 实例化此类viewModel,然后调用viewModel.getUserSettings()。这种方法正在调用一个静态方法UserSettings.getInfo,

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

func getUserSettings() {
   UserSettingsManager.getInfo { (result, error) in
     if error == nil {
        self.userData = result
     }
   }
}
实例化此类
viewModel
,然后调用
viewModel.getUserSettings()
。这种方法正在调用一个
静态
方法
UserSettings.getInfo
,该方法被传递一个
@escaping
闭包以被称为完成。该闭包捕获的是
viewModel
(它在其体内使用
self

  • 调用
    静态
    方法对内存有什么影响?未实例化的
    UserSettings
    类如何“解除分配”

  • 在这种特殊情况下,是否会出现一个强大的参考周期?如果是这样的话,应该如何捕获
    自我

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

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

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

    在这种特殊情况下,是否会出现一个强大的参考周期?如果是这样的话,应该如何捕捉自我:弱还是强

    根据
    getInfo
    中发生的情况,这可能会创建一个引用循环。虽然,这似乎不太可能,但不可能用你发布的片段来确定

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

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

    UserSettingsManager
    → <代码>结束→ <代码>自我


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

    对于#1-对象得到分配和解除分配,而不是类。类的寿命与其所包含的模块的寿命一样长。谢谢您的回答。因此,由于
    viewModel
    未保存对
    usersetingsmanager
    的引用,因此不会出现强引用循环。。。但是,如果在执行闭包并调用
    self
    时解除分配了
    viewController
    ,会发生什么情况?捕获列表是否也可以用于类似的场景,即使它不是为了防止强引用循环?因为闭包包含对
    viewModel
    的强引用,所以在执行闭包或以其他方式释放之前,
    viewModel
    不会被释放。这是在闭包开始时使用
    {[weak self]
    的另一个原因:允许
    viewModel
    取消分配,而不等待此闭包减少其保留计数。