gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:51:55 25 4
gpt4 key购买 nike

我试图在我的 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 甚至在我到达 之前就为 nil ... defaultUser... 有或没有包含 Bundle Identifier 的 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 类上调用 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"));

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

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

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

关于c++ - defaultUserNotificationCenter 在 C++ 中导致 'unrecognized selector' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48018775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com