我有一个 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
?
最佳答案
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]
。
最后,为了形象化您当前的方法,您可以按以下方式考虑它:
UserSettingsManager
→ closure
→ self
那是一条漂亮干净的链条!仅当其中一个链接获得对另一个链接的引用时,才会发生引用循环。
关于swift - 闭包和静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51235011/