Ответ 1
Да, вам нужно позвонить removeObserver:
, если вы не видите, что наблюдаемый класс мог вызвать все освобожденные экземпляры наблюдателя.
Нужно ли явно отправлять removeObserver:
для объектов, которые были добавлены в качестве наблюдателей в NSNotificationCenter
раньше?
Я немного смущен и не могу найти точный ответ для этого.
Пожалуйста, предоставьте мне подробно об этом, в том числе о том, почему мы должны явно удалить Observer, и почему компилятор не помещает его неявно в класс/приложение?
Да, вам нужно позвонить removeObserver:
, если вы не видите, что наблюдаемый класс мог вызвать все освобожденные экземпляры наблюдателя.
От 10.11 наблюдателям не требуется отказывать в регистрации по методу их освобождения.
NSNotificationCenter и NSDistributedNotificationCenter больше не работают отправлять уведомления зарегистрированным наблюдателям, которые могут быть освобождены. Если наблюдатель может быть сохранен как ссылка с низким уровнем обнуления базовое хранилище хранит наблюдателя как слабую ссылку для обнуления. В качестве альтернативы, если объект не может быть сохранен слабо (поскольку он имеет пользовательский механизм сохранения/выпуска, который предотвратит выполнение способность запоминать объект слабо) объект хранится как неслабая ссылка обнуления. Это означает, что наблюдатели не требуются для отмены регистрации в методе их освобождения. [1]
Удаление наблюдателя всегда является умной идеей. Если вы не удалите наблюдателя, сообщения будут отправляться, даже если объект был освобожден. Это может быть даже привязано к другому объекту, что, безусловно, приведет к серьезным неприятностям.
Вам всегда нужно удалять наблюдателей для KVO, а также для уведомлений.