簡體   English   中英

swift - 調用內部 function 時保持循環?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM