繁体   English   中英

在使用LLVM-GCC编译ARC文件时获取“在'strong'之前预期属性属性”

[英]Getting “Expected a property attribute before 'strong'” when compiling an ARC file with LLVM-GCC

我有一个项目,其中包含一些使用ARC的文件,有些则没有。 那些没有禁用ARC的编译器标志的那些。 这很好。

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

我有这样的房产:

@property (strong, nonatomic) NSString *foo;

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

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

如果我改变强势保留,它编译好。 Strong在LLVM编译器中也可以正常工作。

我错过了什么? 保留不是强有力的代名词吗?

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

正如Kevin指出的那样,如果您在静态库项目中的任何位置使用ARC,它将只与LLVM Compiler 3.0及更高版本兼容。

但是,如果要创建使用手动引用计数的框架,但在启用ARC的项目中可以使用并且与较旧的编译器兼容,则可能需要设置一些编译器定义。 我们必须为Core Plot框架执行此操作,以使该框架的标头与使用各种编译器和目标构建的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

这使您可以引用非保留(已分配)实例变量,如下所示:

__cpt_weak CPTAnnotationHostLayer *annotationHostLayer;

具有匹配的属性定义

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM