【发布时间】:2018-06-09 16:02:40
【问题描述】:
我试图在我的 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"));
我在没有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
这表明系统级别没有发生任何异常情况,所以现在我完全不知所措。
【问题讨论】:
-
你想使用 [NSNotificationCenter defaultCenter] 吗?
-
@Land NSNotificationCenter 用于在线程之间发送通知,所以不是我想要的。
-
有什么理由不使用 Objective-C++ 类?然后你可以将 Objective-C 与 C++ 一起使用……直接使用 objc_msgSend 不是一个好主意。
-
@AdamKaplan 这是我正在进行的 POC 项目的一部分。除了实验和学习之外别无他法;)
标签: c++ objective-c objective-c-runtime nsusernotificationcenter