Предупреждение: XXX может не отвечать на YYY - PullRequest
0 голосов
/ 25 декабря 2010

Эй, я делаю кое-что в Objective-C ++ ... И я должен сказать, что я новичок, когда дело доходит до части Objective-C ... Я действительно не хочу изучать это, явроде как это нужно для доступа к нескольким API для Mac (ObjC - такой тупой язык).

Итак, компилирование с g ++ -x target-c ++ - и я каким-то образом продолжаю получать это предупреждение:

Сначала это было с NSScreen, теперь это с NSWindow:

NSWindow may not respond to +initWithContentRect:styleMask:backing:defer:

Я где-то видел, что должен привести его к id, но не сработало, выдавая абсолютно загадочные ошибки ...

Итак - ЧТО на самом деле означает это предупреждение, и КАК я должен его остановить?

РЕДАКТИРОВАТЬ: Хорошо, очевидно, мне нужно сначала выделить экземпляр, а затемЯ могу вызвать его функцию инициализации ... В любом случае, теперь 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 голосов
/ 25 декабря 2010

Сообщение на самом деле не загадочное, вы просто не знаете язык (и вам все равно, по собственному признанию).

Поскольку методы 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, а затем отправить сообщение инициализации. Кроме того, clang, как правило, выдает гораздо лучшие предупреждения и сообщения об ошибках, чем gcc. Clang 2.0 также неплохо работает с C ++ и ObjC ++, поэтому стоит перейти на clang.

0 голосов
/ 25 декабря 2010

Оформить заказ пример , похоже, вы не распределяете свои объекты.

...