В ARC нужно ли отправлять removeObserver: явно?


Должны ли мы посылать removeObserver: явно для объектов, которые были добавлены в качестве наблюдателей к NSNotificationCenter ранее?

Я немного запутался и не могу найти точного ответа на этот вопрос.

Пожалуйста, подробно расскажите мне об этом, в том числе о том, почему нам нужно явно удалить сервер, и почему компилятор не помещает его неявно в класс/приложение?

4 16

4 ответа:

Да, вам нужно вызвать removeObserver:, если вы этого не сделаете, наблюдаемый класс может вызвать все освобожденные экземпляры наблюдателя.

Начиная с 10.11 наблюдатели не обязаны отменять регистрацию в своем методе освобождения.

NSNotificationCenter и NSDistributedNotificationCenter больше нет отправлять уведомления зарегистрированным наблюдателям, которые могут быть освобождены. Если наблюдатель может быть сохранен как слабая ссылка на нуль. базовое хранилище хранит наблюдателя как обнуляющую слабую ссылку. Альтернативно, если объект не может быть сохранен слабо (потому что он имеет пользовательский механизм удержания / освобождения, который бы не допустить выполнения будучи в состоянии хранить объект слабо) объект хранится как неслабая ссылка на обнуление. Это означает, что наблюдатели не требуются чтобы отменить регистрацию в их методе освобождения.[1]

Удаление наблюдателя-это всегда умная идея. Если вы не удалите наблюдателя, сообщения все равно будут отправлены, даже если объект был освобожден. Он может быть даже прикреплен к другому объекту, что определенно приведет к серьезным неприятностям.

Всегда нужно удалять наблюдателей для кво, а также для уведомлений.