[英]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.