我正在尝试在我的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
这显示了系统级别的任何异常情况,所以现在我完全失去了。
答案 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本身并不直接驱动运行时非常好。