我想检索给定通知名称的观察者列表(对象和选择器)。我知道没有官方的 API。我也知道我可以继承 NSNotificationCenter来实现这一点。然而,有时这不是一个可行的选择,因为 NSNotificationCenter 的使用遍布代码甚至二进制框架。
所以我正在寻找一种非官方/私人的方式来做到这一点。(因为它只是关于调试,那很好。)
我想检索给定通知名称的观察者列表(对象和选择器)。我知道没有官方的 API。我也知道我可以继承 NSNotificationCenter来实现这一点。然而,有时这不是一个可行的选择,因为 NSNotificationCenter 的使用遍布代码甚至二进制框架。
所以我正在寻找一种非官方/私人的方式来做到这一点。(因为它只是关于调试,那很好。)
最后,Apple 添加了一种打印所有通知中心观察者的方法:
po [NSNotificationCenter defaultCenter]
它打印一个逗号分隔的列表,其中包含名称、对象、观察者和选项:
<NSNotificationCenter:0x7f997b307500>
Name, Object, Observer, Options
WebPreferencesRemovedNotification, 0x11165b680, 0x116c87ff8, 1400
UIApplicationWillEnterForegroundNotification, 0x11165b680, 0x7f997a838000, 1400
...
如果您不想子类化NSNotificationCenter
,您可以重命名原始addObserver:selector:name:object
方法并使用该名称创建自己的方法,并将其中的观察者添加到某个数组中,然后调用原始重命名方法。
看看以下方法:class_addMethod
, class_replaceMethod
, class_getMethodImplementation
.
还要看看这个 SO 问题:Method Swizzling
我不确定你为什么想要观察者,但你可能会发现这个类很有用,它会自动为你删除观察者,我认为这可能是你想要的。SFO观察者