Подтвердить что ты не робот

Как получить все наблюдатели NSNotificationCenter?

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

Итак, я ищу неофициальный/частный способ сделать это. (Поскольку это касается только отладки, это прекрасно.)

4b9b3361

Ответ 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