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在其主体内使用)。
调用static方法对内存有什么影响?UserSettings未实例化的类将如何“解除分配”?
在这种特殊情况下会发生强引用循环吗?如果是这样,应该如何self捕获:weak或strong?
\n\n\n调用静态方法会对内存产生什么影响?未实例化的 UserSettings 类如何“解除分配”?
\n
在您的问题的上下文中,该函数是静态的这一事实并没有任何特殊的内存含义。静态方法与非静态方法一样有可能创建引用循环。
\n\n正如您所说,如果没有 的实例UserSettingsManager,则不会释放任何实例。仅这一事实并不能消除引用循环的可能性。
\n\n\n在这种特定情况下会发生强引用循环吗?如果是这样,应该如何捕捉自我:弱还是强?
\n
根据 中发生的情况getInfo,这可能会创建一个引用循环。虽然这似乎不太可能,但无法用您发布的代码片段来确定。
为了澄清起见,我应该提到你目前正在强烈地捕捉自我,这是默认的。这意味着闭包会增加 实例的强引用计数,self以便最终调用闭包时它可以成功地与该实例交互。要覆盖此行为并避免引用循环,您可以使用[weak self].
最后,为了可视化您当前的方法,您可以按以下方式思考:
\n\nUserSettingsManager\xe2\x86\x92 closure\xe2\x86\x92self
这是一条漂亮干净的链条!仅当其中一个链接获得对另一个链接的引用时,才会发生引用循环。
\n