[英]swift - retain cycle when calling inner function?
当内部 function progressComplete
在没有弱自我的情况下调用内部闭包时,我是否有一个保留周期( progressComplete
)我使用自我?
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 )保留了 Manager ,一旦调用了doSomething
,Manager 将保留回调方法progressComplete
,它引用了self
。
因此,这不是永久性情况(真正的泄漏),但 SomeClass 不能 go 不存在,直到 Manager 的requestData
执行其回调。 通过实验很容易证实这一点,您可以在 memory 图中看到:
这不一定是坏事,但如果这将是一个问题。 那么你需要修复它。
但是,请注意, weak self
在这里对您没有帮助,因为没有地方说。 你只能在匿名function 的主体中说weak self
——而且你没有任何匿名函数!
因此,如果您对此感到担忧,那么正确的编写方法是放弃您单独的progressComplete
function 并将回调编写为匿名 function,然后进行弱-强舞蹈,如下所示:
self.manager.requestData { [weak self] success in
if let self = self {
self.someVar = nil
completion?(success)
}
}
最好使用像这样的弱自闭包来实现这一点,例如。
class SomeClass{
var manager = Manager()
var someVar:Int?
func doSomething(completion:((Bool) -> Void)?) {
func progressComplete(_ success:Bool) {
self.someVar = nil
completion?(success)
}
// Use [weak self]
self.manager.requestData { [weak self] success in
self?.progressComplete(success)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.