闭包和静态函数

App*_*Dev 5 static closures retain-cycle swift

我有一个ViewModel类的方法是这样的:

func getUserSettings() {
   UserSettingsManager.getInfo { (result, error) in
     if error == nil {
        self.userData = result
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

woo*_*ing 2

\n

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

\n
\n\n

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

\n\n

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

\n\n
\n

在这种特定情况下会发生强引用循环吗?如果是这样,应该如何捕捉自我:弱还是强?

\n
\n\n

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

\n\n

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

\n\n

最后,为了可视化您当前的方法,您可以按以下方式思考:

\n\n

UserSettingsManager\xe2\x86\x92 closure\xe2\x86\x92self

\n\n

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

\n