簡體   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