在使用LLVM-GCC编译ARC文件时,在“strong”之前获得“期望的属性”属性

我有一个包含一些使用ARC的文件的项目,有些则不是。 没有禁用ARC的编译器标志。 这工作正常。

我也想确保我的库编译LLVM-GCC和LLVM编译器。

我有这样一个属性:

@property (strong, nonatomic) NSString *foo; 

但是,当我在LLVM-GCC中编译时,我得到:

“在”强“之前预期属性属性”

如果我强调保留,它编译好。 在LLVM编译器中强也工作正常。

我错过了什么? 保留不强的代名词?

您正在使用一个过时的编译器,并期望它支持新的语言function。 这根本不会发生。 如果您使用ARC引入的关键字,则需要使用Clang。

正如凯文所说,如果你在静态库项目中的任何一点都使用ARC,那么它只能和LLVM Compiler 3.0以上版本兼容。

但是,如果要创build使用手动引用计数的框架,但在支持ARC的项目中可用,并且与较早的编译器兼容,则可能需要设置一些编译器定义。 我们必须为Core Plot框架做这个工作,以便使用各种编译器和目标构build的ARC框架和非ARC框架项目之间的框架标题兼容。

为了做到这一点,我从Ryan Petrich的ZWRCompatibility中得到了答案,他在他的回答中描述了这个问题,并且组装了以下定义:

 #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 

这可以让你引用非保留的(分配的)实例variables,如下所示:

 __cpt_weak CPTAnnotationHostLayer *annotationHostLayer; 

与之匹配的属性定义

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

对于使用LLVM Compiler 3.0的iOS 5.0和Lion的目标,这使得这些属性使用更安全的__weak限定符。 对于LLVM Compiler 3.0下的iOS 4.0和Snow Leopard,这将变成__unsafe_unretained 。 最后,对于任何其他编译器,限定符都是空白的,并且该属性被设置为assign

retain可以用于所有编译器没有太多问题的属性。

你正在使用错误的编译器。 LLVM GCC不支持Strong和其他ARC关键字。 请将您的编译器设置为LLVM编译器4.2