Zim*_*m3r 4 c macos objective-c
我知道有可能使用objc_msgSend使用Objective C代码,我相信,手动运行Objective C运行时但是当我运行这段代码时,我得到引用NSString的错误(即使我从不使用它)以及其他未使用的类.
来自xcode的错误

我上面的目标C代码(注释掉)我试图'模仿'.
#include <Foundation/Foundation.h> /*Added suggestion by answer, same errors*/
#include <AppKit/AppKit.h>
int main()
{
// convert objective c into c code
/*
NSAlert *alert = [[NSAlert alloc] init];
[alert setAlertStyle:NSInformationalAlertStyle];
[alert setMessageText:@"Hello World"];
[alert setInformativeText:@"Hello World"];
[alert runModal];
*/
id alert = objc_msgSend(objc_msgSend(objc_getClass("NSAlert"), sel_registerName("alloc")), sel_registerName("init"));
objc_msgSend(alert, sel_getUid("setAlertStyle:"), NSInformationalAlertStyle);
objc_msgSend(alert, sel_getUid("setMessageText:"), CFSTR("Hello World!"));
objc_msgSend(alert, sel_getUid("setInformativeText:"), CFSTR("Hello World!"));
objc_msgSend(alert, sel_getUid("runModal"));
}
Run Code Online (Sandbox Code Playgroud)
你缺少一些进口.
objc_msgSend宣布在<objc/message.h>.
objc_getClass宣布在<objc/runtime.h>.
sel_getUid并sel_registerName在宣布<objc/objc.h>.
现在,鉴于<objc/objc.h>已经导入了<objc/runtime.h>,将后者与<objc/message.h> 一起导入就足够了.
我使用以下示例测试它,它按预期工作
#include <CoreFoundation/CoreFoundation.h> // Needed for CFSTR
#include <objc/runtime.h>
#include <objc/message.h>
int main(int argc, char *argv[]) {
id alert = (id (*)(id, SEL))objc_msgSend((id (*)(id, SEL))objc_msgSend(objc_getClass("NSAlert"), sel_registerName("alloc")), sel_registerName("init"));
(void (*)(id, SEL, int))objc_msgSend(alert, sel_getUid("setAlertStyle:"), 1); // NSInformationalAlertStyle is defined in AppKit, so let's just use 1
(void (*)(id, SEL, id))objc_msgSend(alert, sel_getUid("setMessageText:"), CFSTR("Hello World!"));
(void (*)(id, SEL, id))objc_msgSend(alert, sel_getUid("setInformativeText:"), CFSTR("Hello World!"));
(int (*)(id, SEL))objc_msgSend(alert, sel_getUid("runModal"));
}
Run Code Online (Sandbox Code Playgroud)
我objc_msgSend在评论中添加了Greg Parker建议的显式演员.
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |