来自纯 C++ 的 NSUserNotification

NSUserNotification from pure C++

我正在尝试 post 来自纯 C++ 的 UserNotification。我的代码基于这个 SO 答案:

现在我无法为对象属性设置值。我确定我缺少某些东西。我试图利用 setValue:forKey 但我找不到任何关于它的文档。我搜索了 objc-runtime.h 和 obj.h 但找不到任何让我跳出来的东西。有人 tried/succeeded 在这吗?

#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>    

int main(int argc, char** argv)
{    

    id app = NULL;


    id notif = (id)objc_getClass("NSUserNotification");
    notif = objc_msgSend(notif, sel_registerName("alloc"));
    notif = objc_msgSend(notif, sel_registerName("init"));
    notif = sel_setValue(CFSTR("title"), id("title"));      <-This line here


    objc_msgSend(pool, sel_registerName("release"));
    return 0;
}

该代码真的可以编译吗? Apple 的 Objective-C 运行时文档近年来变得更糟,但我不记得也找不到任何提及 sel_setValue.

-setValue:forKey: 与其他任何消息一样只是一条常规消息,所以我希望它更像:

objc_msgSend(notif, sel_registerName("setValue:forKey:"), 
             CFSTR("title"), CFSTR("title"))

因为 objc_msgSend 接受可变数量的参数,前两个是目标对象和选择器,其余是方法的各种其他参数。目标键名称以字符串形式提供,它们在内部映射到属性,并尝试了一些不同的组合,在这种情况下,属性 也希望包含一个字符串。

setValue:forKey: 的声明 return 类型是 void,因此没有要捕获的 return 值。

如果将来有人试图实现这一点,我确实最终实现了这一点,并在 github 上制作了一个项目,展示了如何 post 在纯 C 中创建 NSUserNotification。

https://github.com/jslegendre/NS-C-UserNotification