iOS无法删除通知观察者.Deinit没有被召唤

Soh*_*dya 8 memory-leaks nsnotification ios swift deinit

我有一个类似你可以在下面看到的UIView:

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....
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我遇到的问题是当用户点击后退按钮并返回到另一个viewController时,我无法从这个特定的UIView中删除观察者.

ViewWillDisppear被调用但deinit未被调用.奇怪的是,如果我们删除subscribeToNotifications()viewDidLoad()随后deinit被调用.

另一个问题与内存泄漏有关.正如您在下面的屏幕截图中看到的,当视图订阅通知并且用户离开/重新进入视图时,内存使用量会增加.在此输入图像描述

现在将其与subscribeToNotifications()已注释掉的内容进行比较,不会增加内存使用量,也只会增加viewController的一个实例. 在此输入图像描述 结论是,在UIView的新实例的通知订阅创建之间似乎存在相关性,因此deinit未被调用.

我想知道是否有一种方法可以取消初始化视图并取消订阅通知.

如果您需要更多信息,请与我们联系.:)

ada*_*oto 5

我发现removeObserver()仅在使用此版本的addObserver()时有效

notification.addObserver(self, selector:#selector(self.handleUpdateTimer), name: Notification.Name(rawValue: "TimerUpdated"), object: nil)
Run Code Online (Sandbox Code Playgroud)

我猜测原始版本实际上并不能指示观察者是谁。