ios swift memory-leaks nsnotification deinit

iOS no puede eliminar el observador de notificaciones. Deinit no se llama



swift memory-leaks (2)

Como @Spads dijo que puedes usar

NotificationCenter.default.addObserver(self, selector: #selector(subscribeToNotifications), name: NSNotification.Name(rawValue: "TimerUpdate"), object: nil)

o el que ya tienes. puede eliminar su notificación por su nombre o su referencia

NotificationCenter.default.removeObserver(self, name: "TimerUpdate", object: nil)

si declaró su notificación en la parte superior de su clase, puede pasar directamente la referencia de su notificación para eliminarla en su notificación de caso

NotificationCenter.default.removeObserver(notification)

Tengo una UIView similar a la que puedes ver a continuación:

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.... } }

}

El problema que estoy teniendo es que no puedo eliminar a los observadores de esta UIView en particular cuando el usuario presiona el botón Atrás y regresa a otra viewController.

Se llama a deinit pero no se llama a deinit . Lo extraño es que si eliminamos subscribeToNotifications() de viewDidLoad() entonces se llama al deinit .

El otro problema está relacionado con una pérdida de memoria. Como puede ver en la captura de pantalla siguiente, cuando la vista se suscribe a las notificaciones y el usuario se va / vuelve a ingresar a la vista, el uso de la memoria aumenta.

Ahora compare eso con cuando la subscribeToNotifications() Notificaciones subscribeToNotifications() está comentada, no hay aumento en el uso de memoria y solo una instancia de viewController. La conclusión es que parece haber una correlación entre la creación de suscripción de notificación de una nueva instancia de UIView, por lo que no se llama al deinit .

Me gustaría averiguar si hay una manera de desinicializar la vista y cancelar la suscripción a la notificación.

Por favor, avíseme si necesita más información. :)


Descubrí que removeObserver () solo funciona si usa esta versión de addObserver ()

notification.addObserver(self, selector:#selector(self.handleUpdateTimer), name: Notification.Name(rawValue: "TimerUpdated"), object: nil)

Supongo que con la versión original no estás indicando quién es el observador.