【问题标题】:How to retrieve all NSNotificationCenter observers?如何检索所有 NSNotificationCenter 观察者?
【发布时间】:2012-10-27 14:34:47
【问题描述】:

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

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

【问题讨论】:

标签: ios cocoa-touch cocoa nsnotificationcenter


【解决方案1】:

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

看看以下方法:class_addMethodclass_replaceMethodclass_getMethodImplementation

也看看这个 SO 问题:Method Swizzling

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

【讨论】:

  • +1 SFObservers!您指向的 SO 问题实际上来自我(包括解决方案);-)
  • 哈哈,不错的解决方案和问题:D
  • 这里是一个答案,它实现了 swizzling 来跟踪观察者stackoverflow.com/questions/10346700/…
【解决方案2】:

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

po [NSNotificationCenter defaultCenter]

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

<NSNotificationCenter:0x7f997b307500>
Name, Object, Observer, Options
WebPreferencesRemovedNotification, 0x11165b680, 0x116c87ff8, 1400
UIApplicationWillEnterForegroundNotification, 0x11165b680, 0x7f997a838000, 1400
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多