2016-09-23 3 views
4

После прочтения сообщения this для iOS 9, я знаю, что вам больше не нужно удалятьObserver.почему вы должны удалить наблюдателя в ios8?

Однако для прошивки 8, вы needed к removeObserver в deinit способе ViewController. Но я не могу понять. Если viewController освобожден, то это DEAD нет? Зачем нам нужно делать removeObserver. Это, как наблюдатель, похоже на вызов мертвого человека, который никогда не заберет телефон

Что я не понимаю?

+3

Поскольку отправка сообщений на освобожденные экземпляры вызывает сбой приложения ... –

ответ

9

Это полностью объяснено в статье вы связаны:

Центр уведомлений в настоящее время держит обнуления ссылки на наблюдатель:

Если наблюдатель находится в состоянии быть сохранен в виде обнуления-слабого обращения базовое хранилище будет хранить наблюдателя как слабое задание обнуления, альтернативно, если объект не может быть сохранен слабо (т. е. он имеет собственный механизм сохранения/освобождения, который будет препятствовать тому, чтобы среда выполнения могла хранить объект слабо), он сохранит объект как неслабая ссылка обнуления.

Перед прошивкой 9 NSNotificationCenter не были реализованы с использованием weak ссылки так NSNotificationCenter не знали, что цель была освобождаться. Он слепо направил уведомления на любую зарегистрированную цель. Это плохо (вероятно, сбой), если цель была освобождена. Следовательно, необходимо всегда отменить регистрацию.

В iOS 9, NSNotificationCenter начал использовать слабые ссылки. Это означает, что теперь он знает, была ли освобождена одна из зарегистрированных целей или нет. Это означает, что он больше не пытается отправлять уведомления об освобожденных целях. Это означает, что вам больше не нужно явно отменить регистрацию цели до ее освобождения.

4

Это быть наблюдателем очень похож на вызов мертвого человека, который никогда не будет забрать телефон

Точно!

Ваш номер телефона в этом случае является адресом памяти, который будет разыменован после того, как центр уведомлений попытается вызвать наблюдателя. Итак, что вы ожидаете от адреса памяти после того, как View Controller был освобожден? Мы не можем знать.

Но вы, конечно же, не хотите вызывать метод (это то, что делает центр уведомлений) на объекте, который может не быть там больше или даже был заменен чем-то совершенно другим (например, образ).

Чтобы добавить пример реального мира: это больше похоже на то, что ваш автомобиль (контроллер вида) находится в определенном месте в гараже (адрес памяти). Вы абсолютно полагаетесь на свой автомобиль, чтобы быть там, поэтому вы даже не смотрите, есть ли там, когда вы хотите войти. Теперь притворись, что кто-то удалил (освободил) вашу машину, но ты все еще полагаешься на то, что он там. Это, безусловно, будет болезненный опыт, чтобы войти и сесть в машину, которой больше нет.