13

我想检索给定通知名称的观察者列表(对象和选择器)。我知道没有官方的 API。我也知道我可以继承 NSNotificationCenter来实现这一点。然而,有时这不是一个可行的选择,因为 NSNotificationCenter 的使用遍布代码甚至二进制框架。

所以我正在寻找一种非官方/私人的方式来做到这一点。(因为它只是关于调试,那很好。)

4

2 回答 2

19

最后,Apple 添加了一种打印所有通知中心观察者的方法:

po [NSNotificationCenter defaultCenter]

它打印一个逗号分隔的列表,其中包含名称、对象、观察者和选项:

<NSNotificationCenter:0x7f997b307500>
Name, Object, Observer, Options
WebPreferencesRemovedNotification, 0x11165b680, 0x116c87ff8, 1400
UIApplicationWillEnterForegroundNotification, 0x11165b680, 0x7f997a838000, 1400
...
于 2015-11-25T09:22:15.917 回答
1

如果您不想子类化NSNotificationCenter,您可以重命名原始addObserver:selector:name:object方法并使用该名称创建自己的方法,并将其中的观察者添加到某个数组中,然后调用原始重命名方法。

看看以下方法:class_addMethod, class_replaceMethod, class_getMethodImplementation.

还要看看这个 SO 问题:Method Swizzling

我不确定你为什么想要观察者,但你可能会发现这个类很有用,它会自动为你删除观察者,我认为这可能是你想要的。SFO观察者

于 2012-11-07T14:16:00.327 回答