我有一个ViewModel
类,其方法如下:
func getUserSettings() {
UserSettingsManager.getInfo { (result, error) in
if error == nil {
self.userData = result
}
}
}
实例化此类viewModel
,然后调用viewModel.getUserSettings()
。这种方法正在调用static
方法UserSettings.getInfo
,该方法通过@escaping
闭包被称为完成。该闭包正在捕获viewModel
(它是在体内使用self
)。
调用static
方法对内存有什么影响?未被实例化的UserSettings
类将如何“取消分配”?
在这种特定情况下会发生强大的参考周期吗?如果是这样,应该如何捕获self
:weak
或strong
?
答案 0 :(得分:1)
调用静态方法在以下方面有什么后果? 记忆?未实例化的UserSettings类将如何处理 “已分配”?
在您的问题上下文中,该函数为静态这一事实没有任何特殊的内存含义。静态方法与非静态方法一样具有创建参考循环的潜力。
如您所说,如果没有UserSettingsManager
的实例,则不会释放任何实例。单凭这一事实并不能消除参考周期的可能性。
在这种特定情况下会发生强大的参考周期吗?如果是这样,应该如何捕捉自我:弱者还是强者?
根据getInfo
中发生的情况,这可能会创建一个参考周期。虽然似乎不太可能,但是无法肯定地说出您发布的摘录。
为澄清起见,我应该提到您当前正在强烈捕捉自我,这是默认设置。这意味着闭包会增加self
实例的强引用计数,以便在最终调用闭包时它可以与该实例成功交互。要覆盖此行为并避免引用周期,请使用[weak self]
。
最后,要形象化您当前的方法,您可以通过以下方式考虑它:
UserSettingsManager
→closure
→self
那是一个很好的清洁链!仅当这些链接中的一个获得了另一个参考时,才会发生参考循环。