defaultUserNotificationCenter 在 C++ 中导致 'unrecognized selector' 错误

defaultUserNotificationCenter causing 'unrecognized selector' error in C++

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

[NSUserNotificationCenter defaultUserNotificationCenter]: unrecognized selector sent to instance $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

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

如果您在 Objective-C class 上调用 alloc,您将得到一个指向 实例 的指针 class.

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 方法。您只能在实例上调用实例方法,在 Class 实例上只能调用 class 方法。

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

我还认为您应该探索 Objective-C++,使用 .mm 文件。自己用Objective-C,不直接驱动runtime,挺好的。