簡體   English   中英

我可以在deinit中使用didSet嗎?

[英]Can I use didSet in deinit?

我在我的類中添加了一個Timer變量,並使用其didSet觀察器使舊值無效

var timer: Timer? {
    didSet { oldValue?.invalidate() }
}

deinit {
    timer = nil
}

我認為這樣就足以在類被取消初始化時使計時器無效,但看起來似乎沒有調用didSet。 這是為什么? 觀察員在去初始化期間不工作嗎?

我們在這里給出答案,以便我們可以關閉它。

  • 看來物業觀察員顯然不會在deinit期間deinit 這似乎與屬性觀察者在init期間不運行這一事實相似,但與后者不同,前者似乎沒有在任何地方清楚地記錄。

  • 可以通過語義技巧解決這個問題,但不要! 這似乎是一個錯誤(我已經提交了)。

  • 最初的用例並不是一個非常好的用例。 在替換中隱藏計時器的失效聽起來像是潛在的維護噩夢。 同意失效和替換像火腿和雞蛋一樣,我一直在做的是編寫一種方法,按照這個順序使一切無效並替換,並通過該方法匯集所有內容。 (如果需要,可以強制執行,但我不deinit 。)可以在deinit期間調用該方法。

補充說明 :在使用計時器時,請注意內存管理問題! 您可以輕松地讓自己進入一個從未調用 deinit的情況,因為您保留了計時器,但計時器正在保留您。 然后,您將無法使計時器無效,並且您的整個視圖控制器將泄漏。 你不會在你的問題中抱怨這一點,但這是一個相關的問題,所以我認為我會更好地標記它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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