【问题标题】:defaultUserNotificationCenter causing 'unrecognized selector' error in C++defaultUserNotificationCenter 在 C++ 中导致“无法识别的选择器”错误
【发布时间】:2018-06-09 16:02:40
【问题描述】:

我试图在我的 C++ 应用程序中访问 defaultUserNotificationCenter,但我似乎无法让它工作。以下代码导致错误:

[NSUserNotificationCenter defaultUserNotificationCenter]:无法识别的选择器发送到实例 $memory-location-to-notifCenter

在最后一行提出异常。

id notifCenter = (id)objc_getClass("NSUserNotificationCenter");
notifCenter = objc_msgSend(notifCenter, sel_registerName("alloc"));
notifCenter = objc_msgSend(notifCenter, sel_registerName("defaultUserNotificationCenter"));

我在没有allocing notifCenter 的情况下尝试过这个,但是这会导致notifCenter 在我到达...defaultUser... 之前为零,无论是否包含包含捆绑标识符的Info.plist 文件。

为了确保 defaultUserNotificationCenter 在幕后不会发生任何疯狂的事情,我编写了一个小的 Obj-C 程序来做同样的事情(NSUserNotificationCenter *defNotifCenter = [NSUserNotificationCenter defaultUserNotificationCenter];) 并将其加载到 Hopper 以检查程序集,它显示:

    mov  rsi, qword [0x100001128] ;@selector(defaultUserNotificationCenter)
    mov  rdi, qword [objc_cls_ref_NSUserNotificationCenter]
    call imp___stubs__objc_msgSend

这表明系统级别没有发生任何异常情况,所以现在我完全不知所措。

【问题讨论】:

  • 你想使用 [NSNotificationCenter defaultCenter] 吗?
  • @Land NSNotificationCenter 用于在线程之间发送通知,所以不是我想要的。
  • 有什么理由不使用 Objective-C++ 类?然后你可以将 Objective-C 与 C++ 一起使用……直接使用 objc_msgSend 不是一个好主意。
  • @AdamKaplan 这是我正在进行的 POC 项目的一部分。除了实验和学习之外别无他法;)

标签: c++ objective-c objective-c-runtime nsusernotificationcenter


【解决方案1】:

如果你在一个 Objective-C 类上调用 alloc,你会得到一个指向该类的新 instance 的指针。

id notifCenter = (id)objc_getClass("NSUserNotificationCenter");
notifCenter = objc_msgSend(notifCenter, sel_registerName("alloc"));

此时,notifCenter 已重新分配给 NSUserNotificationCenter 的新实例。它不再是对 Class 实例的引用,也不再有权访问 Class 方法。

notifCenter = objc_msgSend(notifCenter, sel_registerName("defaultUserNotificationCenter"));

现在您在该类的 实例 上调用 class 方法。只能在实例上调用实例方法,在 Class 实例上调用类方法。

我认为如果您只删除中间线(带有alloc 的线),这将起作用。

我还认为您应该使用 .mm 文件来探索 Objective-C++。使用 Objective-C 本身而不直接驱动运行时非常好。

【讨论】:

  • 就是这样。我不敢相信我只是忘记用objc_msgSend 包裹objc_getClass 电话。写得真好!
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多