警告:XXX可能无法回复YYY

时间:2010-12-25 12:31:51

标签: nswindow objective-c++

嘿,我正在使用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被导入(在头文件中) - 我不会在这里把你和我奇怪的文件方案混淆。

2 个答案:

答案 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可能是值得的。