【问题标题】:Getting "Expected a property attribute before 'strong'" when compiling an ARC file with LLVM-GCC使用 LLVM-GCC 编译 ARC 文件时出现“在‘强’之前需要一个属性属性”
【发布时间】:2011-12-21 01:42:02
【问题描述】:

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

我还想确保我的库可以针对 LLVM-GCC 和 LLVM 编译器进行编译。

我有这样的财产:

@property (strong, nonatomic) NSString *foo;

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

“在 'strong' 之前需要一个属性属性”

如果我将强更改为保留,它编译得很好。 Strong 在 LLVM 编译器中也能正常工作。

我错过了什么?强不是保留的同义词吗?

【问题讨论】:

    标签: iphone ios automatic-ref-counting


    【解决方案1】:

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

    【讨论】:

    • 啊,作为进一步说明,我将发布静态库。我相信一切都应该没问题,因为我正在使用 Clang 进行编译。我需要做的就是确保在头文件中使用保留。想法?
    • @jimothy:除非你有充分的理由支持 GCC,否则我会说你应该只需要 Clang。
    【解决方案2】:

    正如 Kevin 所指出的,如果您在静态库项目中的任何时候使用 ARC,它只会与 LLVM Compiler 3.0 及更高版本兼容。

    但是,如果您想创建一个使用手动引用计数但又可在启用 ARC 的项目中使用并且与旧编译器兼容的框架,您可能需要设置一些编译器定义。我们必须为 Core Plot 框架执行此操作,以使该框架的标头在 ARC 和使用各种编译器和目标构建的非 ARC 项目之间兼容。

    为此,我借鉴了 Ryan Petrich 的 ZWRCompatibility,他在回答 here 中对此进行了描述,并组装了以下定义:

    #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 Compiler 3.0 下的 iOS 4.0 和 Snow Leopard,这将变为 __unsafe_unretained。最后,对于任何其他编译器,限定符为空且属性设置为assign

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

    【讨论】:

    • Apple 在Availability.h 中的示例使用常量而不是检查宏可用,因此MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 而不是defined(__MAC_10_7) && (MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2012-08-19
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多