defaultUserNotificationCenter在C ++中导致“无法识别的选择器”错误

时间:2017-12-29 07:00:36

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

我正在尝试在我的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"));

我在没有alloc notifCenter的情况下尝试了此操作但是,即使在我使用或不包含包含a的Info.plist文件的notifCenter之前,这也会导致...defaultUser...为零捆绑标识符。

只是为了确保在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

这显示了系统级别的任何异常情况,所以现在我完全失去了。

1 个答案:

答案 0 :(得分:1)

如果您在Objective-C课程上致电alloc,您将获得指向该课程的新实例的指针。

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实例上调用类方法。

我认为如果您删除中间行(alloc行),这将有效。

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