2012-04-09 4 views
0

Я очень новый в мире xcode и Objective-C- Programming. Прямо сейчас я изучаю программирование через «Объективное программирование на С-программировании: большое руководство Nerd Ranch». Из-за более старой версии OSX я просто смог установить xcode 3.2.6. Но в книге используется новейшая версия xcode.xcode 3.2.6: ожидаемое выражение перед @ -token

, проходя через глав, я столкнулся с проблемой:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool{ 
     NSDate *now = [NSDate date];  
     NSLog(@"The date is %@", now); 
    } 
    return 0; 
} 

этот пример кода дает мне следующую ошибку:

"expected expression before @-token"

При поиске решения в Интернете, я обнаружил, что это новый синтаксис для xcode 4 ... Я не знал, что существуют такие существенные различия между 3.2.6 и самой новой версией. Теперь мой вопрос: означает ли это, что весь синтаксис в xcode 4 изменился на предыдущие версии, и книга бессмысленна для меня? Или это просто это заявление? (Если да, то как писать в более старых версиях? Я даже не знаю, к чему это относится, поскольку я - кровавый новичок)

ответ

1

Вы вводите в заблуждение Xcode (IDE) с помощью SDK. Аннотации пула @autorelease были добавлены в SDK iOS 5, который Xcode 4 вам дает. Если вы хотите, чтобы это было запущено в Xcode 3.x, вам нужно убедиться, что вы запускаете его с помощью iOS 5 SDK.

1

Одним словом, ДА.

Apple, поскольку они в значительной степени владеют всем стеком, могут свободно менять язык по своему усмотрению, а от 3.0 до 4.0 имеют некоторые изменения. Я действительно не буду тратить время на то, чтобы попытаться написать программы IOS в 3 раза в этот момент лично.

В API для классов изменились с прошивкой, а также между 3 и 4, 4 и 5.

Я действительно предлагаю, модернизировать ваш Mac к чему-то, что будет поддерживать по крайней мере Xcode 4 в данный момент.

+1

спасибо за ваш ответ. Кажется, это действительно лучше обновить ... – Kirinriki

1

Заменить @autoreleasepool {} с этим кодом:

NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
NSDate *now = [NSDate date]; 
NSLog(@"The date is %@", now); 
[pool release]; 
+0

спасибо, это работает очень хорошо! Таким образом, решение заключается в использовании 'NSAutoreleasePool * pool = [NSAutoreleasePool new]; (....) [пул], 'вместо' @autoreleasepool {} '? Но я буду сталкиваться с синтаксическими различиями в будущем, не так ли? – Kirinriki

+0

Всегда существуют различия, вызывающие проблемы с обратной совместимостью при использовании старых SDK. К счастью, не существует синтаксических различий между версиями SDK для iOS. Тем не менее, Apple настоятельно рекомендует вам использовать только последние и самые большие. Если вы действительно не знаете, что делаете, и почему, вы должны установить Xcode 4.x. – Costique

+0

Это должен быть главный ответ на этот конкретный вопрос. – Melllvar

0

сообщения вы получите относится к новой функции Objective-C, который известен как ARC и предназначаются для упрощения управления памятью. Он доступен для компиляторов Apple ObjC, начиная с Xcode4.

Вы все еще можете использовать эту книгу, но вы должны удалить все заявления, связанные с ARC (это не только @autoreleasepool), и на практике это будет нелегко, потому что вам также потребуется добавить управление памятью.

+0

owh ... хорошо знать ... – Kirinriki

+1

Собственно, '@autoreleasepool {}' не является специфичным для ARC, хотя он был введен примерно в то же время. Обратите внимание, что существует ряд других языковых различий, которые могут вызывать подобные проблемы.OP находится в грубой поездке, не покупая старую книгу или [улучшая] модернизацию до современной версии ОС и Xcode. – bbum