Товарищи по команде написали код, как,

deinit {
    NotificationCenter.default.removeObserver(self)
}

Я прокомментировал это, поскольку наблюдатели уже позаботились об этом. Товарищи по команде хотят сохранить этот код, если нет побочных эффектов. Теперь, даже если мы сохраним этот код выше, есть ли побочный эффект?

Должен ли я также вызвать super.deinit() внутри deinit?

0
Sazzad Hissain Khan 24 Фев 2020 в 10:25

2 ответа

Лучший ответ

Начиная с iOS 9, вам не нужно удалять наблюдателей самостоятельно, если вы не используете блочные наблюдатели. Система сделает это за вас, так как она использует нулевые ссылки для наблюдателей, где это возможно.

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

Наблюдатели на основе блоков с помощью метода - [NSNotificationCenter addObserverForName: object: queue: usingBlock] по-прежнему должны быть незарегистрированными, когда они больше не используются, поскольку система все еще сохраняет сильную ссылку на этих наблюдателей.

Apple Docs

А для super.deinit () яблоко говорит

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

быстрые документы

6
jawadAli 24 Фев 2020 в 08:03

Да, это действительно, чтобы переопределить

deinit()

Как указано в комментариях. Супер не нужно называть. Я подтвердил это в документах Apple.

Явная очистка это хорошая идея, ИМО. Особенно когда дело доходит до потоков, уведомлений и таймеров.

1
Woodstock 24 Фев 2020 в 07:40