Наблюдатели, оставшиеся в таблице отправлений после удаления объекта - PullRequest
1 голос
/ 01 февраля 2020

Вид нового вопроса ie, так что простите, если я пропускаю некоторые базовые c понятия ...

У меня есть контроллер представления в окне, которое содержит несколько NSTableView, каждый из которых есть различные связанные наблюдатели, добавленные через addObserver. Они работают нормально и, как и ожидалось, с уведомлениями, идущими к каждому правильному виду таблицы. Однако если я закрою окно, а затем открою новое окно (того же типа), отправленные уведомления будут отправлены в представлениях таблицы ранее закрытого окна.

У меня сложилось впечатление, что как из macOS 10.11 наблюдателей не нужно было явно удалять, что, как я предполагаю, произойдет, когда будет закрыто исходное окно ... ЕСЛИ Я упускаю что-то фундаментальное в закрытии windows. На данный момент я не делаю ничего особенного, когда пользователь закрывает окно, а окно просто исчезает с экрана. Живут ли представления, созданные в моем методе viewDidLoad, даже после закрытия окна? Или нет, мне нужно явно избавиться от этих представлений в методе, таком как viewWIllDisappear?

Спасибо!

1 Ответ

1 голос
/ 02 февраля 2020

Даже когда объект, добавленный вами в качестве наблюдателя, расположен, наблюдатель - нет. Согласно официальной документации, вы должны соединить каждый addObserver с соответствующим removeObserver. Это верно и для NotificationCenter, и для КВО. Кстати, добавление объекта в качестве наблюдателя не увеличивает его владельцев, поэтому при правильном управлении памятью оставленный наблюдатель приводит к времени выполнения cra sh - поэтому необходим спаренный removeObserver (если в такой ситуации нет cra sh, это означает, что есть утечка).

Место, где это сделать, зависит от использования. Если вы добавляете наблюдателя в viewWillAppear, то лучше удалить его в viewWillDisappear, если вы добавляете при создании, удаление должно быть сделано в deinit

...