我有一個類似於下面你可以看到一個UIView:iOS無法刪除通知觀察者。 DEINIT沒有得到所謂的
class ViewTaskViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
subscribeToNotifications()
}
func subscribeToNotifications() {
let notification = NotificationCenter.default
notification.addObserver(forName: Notification.Name(rawValue: "TimerUpdated"), object: nil, queue: nil, using: handleUpdateTimer)
print("Subscribed to NotificationCenter in ViewTaskViewController")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("TUFU TUFU TUFU")
NotificationCenter.default.removeObserver(self)
}
deinit {
print("DENINT")
}
@objc func handleUpdateTimer(notification: Notification) {
if let userInfo = notification.userInfo, let timeInSeconds = userInfo["timeInSeconds"] as? Int {
withUnsafePointer(to: &self.view) {
print("We got timeeeeee \(timeInSeconds) \($0)")
}
//do something here....
}
}
}
我遇到的問題是,我無法從在這個特殊的UIView刪除觀察員用戶點擊後退按鈕並返回到另一個viewController。
ViewWillDisppear
被調用,但不調用deinit
。奇怪的是,如果我們從viewDidLoad()
中刪除subscribeToNotifications()
,則調用deinit
。
另一個問題與內存泄漏有關。正如您在下面的屏幕截圖中看到的那樣,當視圖預訂通知並且用戶離開/重新進入視圖時,內存使用率會增加。
現在比較一下,當subscribeToNotifications()
被註釋掉時,沒有增加內存使用量並且只有viewController的一個實例。 結論是,通知訂閱創建UIView的新實例似乎存在相關性,因此
deinit
未被調用。
我想知道是否有辦法可以取消初始化視圖並取消訂閱通知。
如果您需要更多信息,請讓我知道。 :)
您正在使用的'addObserver'方法的文檔說:「要取消註冊觀察,請將此方法返回的**對象傳遞給removeObserver(_ :)。」相反,你似乎認爲'self'是註冊的對象。 –