闭包和静态函数
Closures and static funcs
我有一个 ViewModel
class,其方法如下:
func getUserSettings() {
UserSettingsManager.getInfo { (result, error) in
if error == nil {
self.userData = result
}
}
}
这个classviewModel
被实例化,然后viewModel.getUserSettings()
被调用。这种方法正在调用一个 static
方法 UserSettings.getInfo
,该方法传递一个 @escaping
闭包以作为完成调用。该闭包正在捕获 viewModel
(它在其主体内使用 self
)。
调用 static
方法对内存有什么影响?未实例化的 UserSettings
class 怎么会是 "deallocated"?
在这种特定情况下会发生强引用循环吗?如果是,应该如何捕获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
实例的强引用计数,以便它可以在最终调用闭包时成功地与该实例进行交互。要覆盖此行为并避免引用循环,您可以使用 [weak self]
.
最后,为了形象化您当前的方法,您可以按以下方式考虑它:
UserSettingsManager
→closure
→self
那是一条漂亮干净的链条!仅当其中一个链接获得对另一个链接的引用时,才会发生引用循环。
我有一个 ViewModel
class,其方法如下:
func getUserSettings() {
UserSettingsManager.getInfo { (result, error) in
if error == nil {
self.userData = result
}
}
}
这个classviewModel
被实例化,然后viewModel.getUserSettings()
被调用。这种方法正在调用一个 static
方法 UserSettings.getInfo
,该方法传递一个 @escaping
闭包以作为完成调用。该闭包正在捕获 viewModel
(它在其主体内使用 self
)。
调用
static
方法对内存有什么影响?未实例化的UserSettings
class 怎么会是 "deallocated"?在这种特定情况下会发生强引用循环吗?如果是,应该如何捕获
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
实例的强引用计数,以便它可以在最终调用闭包时成功地与该实例进行交互。要覆盖此行为并避免引用循环,您可以使用 [weak self]
.
最后,为了形象化您当前的方法,您可以按以下方式考虑它:
UserSettingsManager
→closure
→self
那是一条漂亮干净的链条!仅当其中一个链接获得对另一个链接的引用时,才会发生引用循环。