嘿,我正在使用Objective-C ++制作一些东西...而且我必须说,当谈到Objective-C部分时,我是一个全新的...我真的不想学习它,我有点只需要它来访问一些Mac API(ObjC就是这么愚蠢的语言)。
所以 - 用g ++ -x objective-c ++编译 - 我不知何故不断收到这个警告:
XXX may not respond to YYY
首先是NSScreen,现在是NSWindow:
NSWindow may not respond to +initWithContentRect:styleMask:backing:defer:
我看到某个地方我应该把它投入id,但没有用,抛出绝对神秘的错误......
那么 - 这个警告实际意味着什么,我该如何让它停止?
编辑:好吧,显然我需要首先分配一个实例,然后我可以调用它的init函数......无论如何,现在GCC正在报告:
confused by earlier errors, bailing out
其他没有。这是它报告的唯一错误。我认为我的代码中有一些错误没有报告......所以我会将问题发布在整个文件中:
ONXeWindow::ONXeWindow(int px, int py, int sw, int sh, bool resizable){
NSRect wr = NSMakeRect(px, py, sw, sh);
int wf = 1; // titled
wf += 2; // closable
wf += 4; // miniaturizable
wf += (resizable ? 8 : 0); // resizable
wf += (false ? 128 : 0); // metal bg
useWindow = [[NSWindow alloc] initWithContentRect:wr styleMask:wf backing:2 defer:YES];
}
另外,是的,框架AppKit被导入(在头文件中) - 我不会在这里把你和我奇怪的文件方案混淆。
答案 0 :(得分:0)
结帐example,看起来你没有分配你的对象。
答案 1 :(得分:0)
这个消息并不是很神秘,你只是不懂语言(并且不在乎,自己承认)。
由于Objective-C方法是在运行时动态调度的,因此您可以调用编译器不知道的方法,但是,编译器会警告您正在执行此操作。方法名称开头的+表示您正在调用类方法(a - 表示您正在调用实例上的方法)。由于NSWindow没有名为initWithContentRect:styleMask:backing:defer:
的类方法,编译器会给你一个警告,在这种情况下,它是一个非常好的。
您可能写过类似的内容:
NSWindow* myWindow = [NSWindow initWithContentRect:rect styleMask:0 backing:0 defer:NO];
当你打算写下这样的东西时:
NSWindow* myWindow = [[NSWindow alloc] initWithContentRect:rect styleMask:0 backing:0 defer:NO];
第一个将消息直接发送给类,但这是一个实例方法。您需要先分配NSWindow的实例,然后发送init消息。此外,clang倾向于提供比gcc更好的警告和错误消息。 Clang 2.0也很好地处理C ++和ObjC ++,因此切换到clang可能是值得的。