Какой тип ссылки NSNotificationCenter хранит для «объекта наблюдения»? - PullRequest
19 голосов
/ 08 января 2009

Может кто-нибудь прояснить / прояснить ситуацию с -[NSNotificationCenter addObserver:selector:name:object:]?

  • Какие типы ссылок хранятся в центре уведомлений аргументов «наблюдатель» и «объект»?

  • Каковы наилучшие методы удаления наблюдателей из центра уведомлений?

  • Каковы особые проблемы для многопоточных приложений, особенно в отношении аргумента 'object'?

  • Каковы различия в поведении этого метода в средах GC и не-GC?

  • Существуют ли какие-либо существенные различия (с точки зрения клиента) между мобильными и настольными средами в поведении этого метода?

Кроме того, любые ссылки на существующие статьи, которые охватывают это, будут с благодарностью. Я гуглил, но был удивлен, обнаружив небольшое углубленное обсуждение этих вопросов (хотя, возможно, я не использовал правильные магические ключевые слова).

Ответы [ 2 ]

25 голосов
/ 08 января 2009

какие типы ссылок хранятся центр уведомлений Аргументы «наблюдатель» и «объект»?

Я считаю, что слабая ссылка, хотя это только по памяти (без каламбура).

каковы лучшие практики для удаление наблюдателей от Центр уведомлений?

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

Каковы особые проблемы для многопоточные приложения, особенно WRT аргумент «объект»?

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

в чем различия в поведении этого метода в GC и не-GC среды?

Я не помню, чтобы вы слышали о чем-либо, о чем вам нужно беспокоиться, хотя я еще не использовал GC.

есть какие-либо существенные различия (с точки зрения клиента) между мобильные и настольные среды в поведение этого метода?

Не то чтобы я слышал, нет. Когда вы регистрируете свой объект, вы можете выбрать для регистрации все уведомления или только уведомления от определенного объекта. Если вы интенсивно используете уведомления, последнее может быть немного быстрее, но всегда проверяйте, чтобы быть уверенным.

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

Я думаю, что это больше, потому что NSNotificationCenter довольно прост в использовании. Если вас беспокоят определенные случаи, не бойтесь написать быстрое тестовое приложение!

10 голосов
/ 05 мая 2016

Текущая ситуация в 2016 году:

iOS 9 изменилась NSNotificationCenter так, что она слабые ссылки целевой объект.

Это также означает, что вам больше не нужно вводить removeObserver, когда объект освобожден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...