问题描述
当内部函数 progressComplete
在没有弱 self 的情况下调用内部闭包并且在它内部 (progressComplete
) 我使用 self 时,我是否有一个保留循环?
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
self.manager.requestData { success in
progressComplete(success)
}
}
}
解决方法
我有保留周期吗
是的,从某种意义上说,您可能是认真的。 self
(SomeClass)保留管理器,一旦调用 doSomething
,管理器将保留引用 progressComplete
的回调方法 self
。
因此,这不是永久性的情况(真正的泄漏),但是在 Manager 的 requestData
执行其回调之前,SomeClass 不会消失。通过实验很容易证实这一点,你可以在内存图中看到:
这不一定是坏事!但如果它会成为一个问题,那么你需要修复它。
但是,请注意 weak self
在这里对您没有帮助,因为 没有地方可以说。您只能在 匿名 函数的主体中使用 weak self
— 而且您没有任何匿名函数!
所以写这个的正确方法,如果你担心的话,是放弃你单独的 progressComplete
函数,把回调写成一个匿名函数,然后做弱-强的舞蹈,像这样:
self.manager.requestData { [weak self] success in
if let self = self {
self.someVar = nil
completion?(success)
}
}
,
最好使用 weak self 像这样的闭包。
/config/