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"));
我已经在没有 alloc
ing 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,挺好的。
我正在尝试在我的 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"));
我已经在没有 alloc
ing 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,挺好的。