Swift 闭包与静态函数
我有一个Swift 闭包与静态函数,swift,static,closures,retain-cycle,Swift,Static,Closures,Retain Cycle,我有一个ViewModel类,其方法如下: func getUserSettings() { UserSettingsManager.getInfo { (result, error) in if error == nil { self.userData = result } } } 实例化此类viewModel,然后调用viewModel.getUserSettings()。这种方法正在调用一个静态方法UserSettings.getInfo,
ViewModel
类,其方法如下:
func getUserSettings() {
UserSettingsManager.getInfo { (result, error) in
if error == nil {
self.userData = result
}
}
}
实例化此类viewModel
,然后调用viewModel.getUserSettings()
。这种方法正在调用一个静态
方法UserSettings.getInfo
,该方法被传递一个@escaping
闭包以被称为完成。该闭包捕获的是viewModel
(它在其体内使用self
)
静态
方法对内存有什么影响?未实例化的UserSettings
类如何“解除分配”自我
:弱
或强
UserSettingsManager
的实例,则不会释放任何实例。这一事实本身并不能消除参考循环的可能性
在这种特殊情况下,是否会出现一个强大的参考周期?如果是这样的话,应该如何捕捉自我:弱还是强
根据getInfo
中发生的情况,这可能会创建一个引用循环。虽然,这似乎不太可能,但不可能用你发布的片段来确定
为了澄清,我应该提到,您当前正在强烈地捕获self,这是默认设置。这意味着闭包会增加self
实例的强引用计数,以便在最终调用闭包时它能够成功地与该实例交互。要覆盖此行为并避免引用循环,您需要使用[弱自我]
最后,为了形象化您当前的方法,您可以以下列方式来考虑:
UserSettingsManager
→ <代码>结束→ <代码>自我
那是一条干净的链条!只有当其中一个链接获得了对另一个链接的引用时,引用循环才会发生。对于#1-对象得到分配和解除分配,而不是类。类的寿命与其所包含的模块的寿命一样长。谢谢您的回答。因此,由于
viewModel
未保存对usersetingsmanager
的引用,因此不会出现强引用循环。。。但是,如果在执行闭包并调用self
时解除分配了viewController
,会发生什么情况?捕获列表是否也可以用于类似的场景,即使它不是为了防止强引用循环?因为闭包包含对viewModel
的强引用,所以在执行闭包或以其他方式释放之前,viewModel
不会被释放。这是在闭包开始时使用{[weak self]
的另一个原因:允许viewModel
取消分配,而不等待此闭包减少其保留计数。