Можно ли использовать LLVM 4.0 в Xcode 4.3?

Другими словами, используйте литералы, но цель для iOS 5.

Я знаю об этом, но этот пост не является окончательным.

1 ответ

Решение

Вы можете отключить компилятор, но он не работает, как вы думаете (я попробовал это только сейчас). Существует несколько требований к компилируемому SDK для использования этого нового синтаксиса (то есть он будет работать в предыдущих версиях iOS, но вам нужно скомпилировать его с iOS 6.0 SDK). Я не думаю, что мне разрешено обсуждать их здесь в данный момент, но они подробно описаны в видеоролике WWDC 2012 "Modern Objective-C".

По сути, у вас будет синтаксис, но библиотеки не будут знать, как на него реагировать.

Хотя есть альтернативная теория... что я просто не сделал это правильно ^^;

В конце концов, вам не нужно использовать 4.3 для развертывания приложений 5.x. Так что мое предложение - просто обновить, в этом действительно нет никаких недостатков (если только вы не развернете приложение в ближайшее время, но в этом случае будет просто хлопотно конвертировать все, так как я предполагаю, что вы почти закончили).

РЕДАКТИРОВАТЬ (спустя 2 месяца теперь iOS 6 является публичной). Вы можете определенно использовать категории, чтобы обойти требования SDK нового буквального синтаксиса target-c. Добавить категории на NSArray а также NSDictionary за - (id)objectAtIndexedSubscript:(NSUInteger)idx а также - (id)objectForKeyedSubscript:(id)key соответственно что просто вернуть objectAtIndex: а также objectForKey: (это то, что они в любом случае делают в iOS 6). Также для NSMutableArray а также NSMutableDictionary добавить методы категории для - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index а также - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index соответственно, просто добавьте объект, если он еще не существует, и замените его, если он существует.

Один улов: определения YES а также NO изменено в iOS 6 для размещения логических литералов для NSNumber, Так что вам нужно сделать следующее:

#if __has_feature(objc_bool)
#undef YES //Before it was (BOOL)1
#undef NO //Before it was (BOOL)0

#define YES __objc_yes
#define NO __objc_no
#endif

Причина в том, что в новом синтаксисе уже есть определение для @( ... ) синтаксис (выражения в штучной упаковке) и старое определение будет разрешать в @(BOOL)1 что является ошибкой

Другие вопросы по тегам