Не в состоянии скомпилировать Objective-C на Xcode 4 - PullRequest
0 голосов
/ 19 марта 2011

Я купил Xcode 4, чтобы начать разработку приложений для iOS. Я родом из C, C ++. Я ввел примеры отсюда: http://en.wikibooks.org/wiki/Objective-C_Programming/syntax в проект XCode (инструмент командной строки-> шаблон основания, не то, чтобы я знал, что это значит, только то, что я где-то читал). Я назвал файлы: point.h, point.m, main.m

Сначала я получил 3 ошибки. Я избавился от 2 из них, изменив имя класса с «Point» на «MyClass» но теперь я получаю следующее предупреждение: Метод '+ new' не найден (тип возвращаемого значения по умолчанию равен 'id') О линии: MyClass *point = [MyClass new]

Я также не получаю вывод в секции вывода отладчика.

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Кажется, у вас есть некоторые проблемы ...

Я бы сказал, что вы забыли наследовать от NSObject, поэтому метод +new не найден.

@interface MyClass : NSObject

@end
1 голос
/ 19 марта 2011

Хорошо, начнем с самого начала. Прочитайте это .

Теперь "+ новый" имеет смысл.Это говорит вам о том, что вы запрашиваете отправить сообщение в КЛАСС "MyClass".Это очень отличается от экземпляра «MyClass».Сообщения класса на других языках называются «статическими методами» или «методами класса».В ObjC методы класса представлены +, а методы экземпляра представлены -.

Наиболее распространенный метод класса - alloc.В ObjC вы отправляете это сообщение классу, чтобы создать новый экземпляр и вернуть его.После выделения памяти для нового экземпляра вы можете отправить ему сообщение init.С этого момента вы можете retain или release.Я думаю, вы поняли идею.Большинство сообщений предназначено для отправки экземпляру класса, а не самому классу.

Итак ....

MyClass* c = [[MyClass alloc] init];
[c doStuff];
[c release];

Сначала мы выделяем новую память для хранения объектаMyClass.Затем мы отправляем ему сообщение init, чтобы убедиться, что все настроено правильно.После этого мы отправляем сообщение doStuff в инициализированный экземпляр MyClass, хранящийся в переменной c.Затем мы освобождаем память, отправляя сообщение release.

Примечание о сохранении / освобождении.

Когда мы распределили, счет сохранения изменяется с 0 на 1. Когда мы освобождаем,значение счетчика составляет от 1 до 0. Это похоже на некоторые «умные указатели» на других языках.Как только счет удержания достигает 0, объект освобождается.Таким образом, когда сообщение о выпуске отправляется сюда, вы должны иметь возможность установить точку останова в вашем блоке dealloc MyClass (метод экземпляра).Просто помните, что когда вы указываете блоки init или dealloc, всегда отправляйте сообщение также и super, чтобы вы смогли правильно очистить.

edit:

Да, я думаю, вы должны наследовать от NSObject как говорит @macmade.Вы получаете все виды действительно полезных вещей из этого базового класса, таких как new, alloc, init, release, retain, autorelease и т. Д. Причина этого в том, что ваш экземпляр будет жить в куче, а не в стеке.В таком языке, как Java или C #, вы бы прозрачно получили эту унифицированную систему типов.Поскольку это ObjC, вам нужно подписаться на него.

Если вы предпочитаете управлять своей точкой как структурой (взгляните на встроенную CGPoint), вы тоже можете это сделать, но в этом случае вам придется управлять ею совсем по-другому.Это будет стековая память, а не куча памяти.Вы можете получить хороший пример различия, посмотрев на источник таких вещей, как CGPoint или CGRect.На самом деле, все это очень четко задокументировано на языке программирования Apple Objective-C .

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