Как получить все наблюдатели NSNotificationCenter?
Я хотел бы получить список наблюдателей (объектов и селекторов) для данного имени уведомления. Я знаю, что для этого нет официального API. Я также знаю, что могу подкласс NSNotificationCenter выполнить это. Иногда это не является жизнеспособным вариантом, поскольку использование NSNotificationCenter распространяется по всему коду или даже двоичным фреймворкам.
Итак, я ищу неофициальный/частный способ сделать это. (Поскольку это касается только отладки, это прекрасно.)
Ответы
Ответ 1
Наконец, Apple добавила способ распечатать всех наблюдателей центра уведомлений:
po [NSNotificationCenter defaultCenter]
Он печатает список, разделенный запятыми, с именем, объектом, наблюдателем и параметрами:
<NSNotificationCenter:0x7f997b307500>
Name, Object, Observer, Options
WebPreferencesRemovedNotification, 0x11165b680, 0x116c87ff8, 1400
UIApplicationWillEnterForegroundNotification, 0x11165b680, 0x7f997a838000, 1400
...
Ответ 2
Если вы не хотите подкласса NSNotificationCenter
, вы можете переименовать оригинальный метод addObserver:selector:name:object
и создать свой собственный с таким именем и добавить туда наблюдателей в некоторый массив, а затем вызвать оригинальный переименованный метод.
Взгляните на следующие методы: class_addMethod
, class_replaceMethod
, class_getMethodImplementation
.
Также посмотрите на этот вопрос SO: Метод Swizzling
Я не уверен, почему вы хотите наблюдателей, но вы можете найти этот класс полезным, который автоматически удаляет наблюдателей для вас, что, я думаю, может быть тем, что вы хотите. SFObservers