Что именно не так с этим упрощенным кодом Objective-C? - PullRequest
0 голосов
/ 19 апреля 2011

В настоящее время я перехожу с C на Objective-C, и мне кажется, что этот код, кажется, все находит денди, но XCode думает иначе. Я получил этот пример кода из интернета и постоянно пытался его исправить, и я пришел к выводу:

#include <objc/Object.h>

@interface Greeter:Object
{
    /* This is left empty on purpose:
     ** Normally instance variables would be declared here,
     ** but these are not used in our example.
     */
}

- (void)greet;

@end

#include <stdio.h>

@implementation Greeter

- (void)greet
{
    printf("Hello, World!\n");
}

@end

#include <stdlib.h>

int main(void)
{

    id myGreeter;
    myGreeter = [Greeter new];

    [myGreeter greet];

    [myGreeter release];
    return 0;
}

Ошибка, кажется, в строке myGreeter = [Greeter new];, и XCode изолирует проблему как что-то в потоке 1. Нужно ли что-нибудь выделять / инициализировать?

Ниже находится журнал консоли:

[Switching to process 1833 thread 0x0]
2011-04-18 21:52:10.323 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement methodSignatureForSelector: -- trouble ahead
2011-04-18 21:52:10.326 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement doesNotRecognizeSelector: -- abort
sharedlibrary apply-load-rules all
Current language:  auto; currently objective-c
(gdb) 

Ответы [ 6 ]

3 голосов
/ 19 апреля 2011

Ваш класс Greeter наследуется от класса Objective-C Object. В Какао корневой класс (обычно) NSObject, и вы должны наследовать от него. Это может решить вашу проблему.

2 голосов
/ 19 апреля 2011

Greeter:Object должно быть Greeter:NSObject, "Объект" не является классом класса c.

0 голосов
/ 19 апреля 2011

На самом деле использование new является своего рода сокращением для alloc / init, как вы можете прочитать о здесь

ОДНАКО, вы используете target-c за пределами Какао, как кажетсяпотому что вы наследуете от Object, а не NSObject и так далее.Поэтому я думаю, что вы должны явно использовать myGreeter = [[myGreeter alloc] init];

Кроме того, поскольку вы говорите Xcode, вы должны использовать Какао.Попробуйте:

#import <Cocoa/Cocoa.h>

А затем также переключите Object на NSObject

0 голосов
/ 19 апреля 2011

Может быть, я ошибаюсь, но я всегда думал, что вы выделены в Objective - C, как это

id myGreeter;
myGreeter= [[myGreeter alloc] init];
0 голосов
/ 19 апреля 2011

Ваш пример использует среду выполнения GNU и поэтому немного устарел.Компилятор по умолчанию использует среду выполнения NeXT, но его можно настроить на использование среды выполнения GNU с параметром компиляции -fgnu-runtime

Вам следует изучить хорошую книгу о Objective-C, например "Программирование в Objective-C", с помощьюСтивен Кочан

http://www.amazon.com/Programming-Objective-C-Stephen-Kochan/dp/0672325861

0 голосов
/ 19 апреля 2011

Разве это не просто остановка отладчика XCode на точке останова по умолчанию в "main"? Просто нажмите кнопку «Продолжить» (или аналогичную в меню «Выполнить»), и вы получите золотую медаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...