Получение «Ожидаемый атрибут свойства перед« сильным »» при компиляции файла ARC с LLVM-GCC - PullRequest
9 голосов
/ 21 декабря 2011

У меня есть проект, который содержит некоторые файлы, использующие ARC, а некоторые нет. Те, которые не имеют флаг компилятора, который отключает ARC. Это отлично работает.

Я также хочу убедиться, что моя библиотека компилируется для LLVM-GCC, а также LLVM Compiler.

У меня есть такое свойство:

@property (strong, nonatomic) NSString *foo;

Однако, когда я компилирую в LLVM-GCC, я получаю:

"Ожидается, что атрибут свойства до 'strong'"

Если я меняю сильный, чтобы сохранить, он прекрасно скомпилируется. Strong также отлично работает в LLVM Compiler.

Чего мне не хватает? Не является ли сильный синонимом слова retain?

Ответы [ 3 ]

12 голосов
/ 21 декабря 2011

Вы используете устаревший компилятор и ожидаете, что он будет поддерживать новые языковые функции. Это просто не произойдет. Если вы используете ключевые слова, введенные в ARC, вам нужно использовать Clang.

7 голосов
/ 21 декабря 2011

Как указывает Кевин, если вы используете ARC в любой точке проекта статической библиотеки, он будет совместим только с LLVM Compiler 3.0 и выше.

Однако, если вы хотите создать платформу, которая использует ручной подсчет ссылок, но при этом может использоваться в проекте с поддержкой ARC и совместима со старыми компиляторами, вам может потребоваться настроить некоторые определения компилятора. Мы должны были сделать это для платформы Core Plot, чтобы заголовки этой платформы были совместимы между ARC и не-ARC проектами, созданными с использованием различных компиляторов и целей.

Для этого я взял из совместимости Райана Петрича *1006*, которую он описывает в своем ответе здесь , и собрал следующие определения:

#if TARGET_OS_IPHONE && defined(__IPHONE_5_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0) && __clang__ && (__clang_major__ >= 3)
#define CPT_SDK_SUPPORTS_WEAK 1
#elif TARGET_OS_MAC && defined(__MAC_10_7) && (MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7) && __clang__ && (__clang_major__ >= 3)
#define CPT_SDK_SUPPORTS_WEAK 1
#else
#define CPT_SDK_SUPPORTS_WEAK 0
#endif

#if CPT_SDK_SUPPORTS_WEAK
#define __cpt_weak        __weak
#define cpt_weak_property weak
#else
#if __clang__ && (__clang_major__ >= 3)
#define __cpt_weak __unsafe_unretained
#else
#define __cpt_weak
#endif
#define cpt_weak_property assign
#endif

Это позволяет вам ссылаться на не сохраненные (назначенные) переменные экземпляра, как показано ниже:

__cpt_weak CPTAnnotationHostLayer *annotationHostLayer;

с соответствующим определением свойства

@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer;

Для целей iOS 5.0 и Lion, использующих LLVM Compiler 3.0, эти свойства используют более безопасный классификатор __weak. Для iOS 4.0 и Snow Leopard под LLVM Compiler 3.0 это превращается в __unsafe_unretained. Наконец, для любого другого компилятора квалификатор пуст и свойство имеет значение assign.

retain можно использовать для свойств без особых проблем во всех компиляторах.

0 голосов
/ 02 августа 2013

Вы используете неправильный компилятор.LLVM GCC не поддерживает Strong и другие ключевые слова ARC.Пожалуйста, установите ваш компилятор как LLVM-компилятор 4.2

...