2011-12-21 42 views
9

我有一個項目包含一些使用ARC的文件,有些則不是。那些沒有禁用ARC的編譯器標誌。這工作正常。在使用LLVM-GCC編譯ARC文件時,在'strong'之前獲取「預期屬性屬性」

我也想確保我的庫編譯LLVM-GCC和LLVM編譯器。

我有這樣的特性:

@property (strong, nonatomic) NSString *foo; 

然而,當我在LLVM-GCC編譯,我得到:

「之前的預期 '強' 屬性屬性」

如果我強烈地保留下來,它編譯得很好。 強也在LLVM編譯器中正常工作。

我錯過了什麼?保留不強的代名詞?

回答

12

您正在使用過時的編譯器,並期望它支持新的語言功能。這根本不會發生。如果您使用ARC引入的關鍵字,則需要使用Clang。

+0

嗯,就像進一步的說明一樣,我將運送靜態庫。我相信一切都應該沒問題,因爲我正在使用Clang進行編譯。我需要做的就是確保在頭文件中使用retain。思考? – jimothy 2011-12-21 01:52:48

+1

@jimothy:除非你有很好的理由來支持GCC,否則我會說你應該只是要求Clang。 – 2011-12-21 02:08:42

7

正如凱文所示,如果您在靜態庫項目中的任何位置使用ARC,它只會與LLVM Compiler 3.0及更高版本兼容。但是,如果您想創建一個使用手動引用計數的框架,但在支持ARC的項目中可用並且與較早的編譯器兼容,則可能需要設置一些編譯器定義。我們必須爲Core Plot框架執行此操作,以便使該框架的標題在使用各種編譯器和目標構建的ARC和非ARC項目之間兼容。

要做到這一點,我從瑞安佩特里奇的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 Compiler 3.0的iOS 5.0和Lion的目標,這使得這些屬性使用更安全的__weak限定符。對於LLVM Compiler 3.0下的iOS 4.0和Snow Leopard,這將轉向__unsafe_unretained。最後,對於任何其他編譯器,限定符都是空白,並且屬性設置爲assign

retain可用於所有編譯器中沒有太多問題的屬性。

+0

Apple在Availability.h中的示例使用常量,而不是檢查宏是否可用,所以'MAC_OS_X_VERSION_MIN_REQUIRED> = 1070'而不是'defined(__ MAC_10_7)&&(MAC_OS_X_VERSION_MIN_REQUIRED> = __MAC_10_7)'。 – 2013-04-07 15:26:00

0

您正在使用錯誤的編譯器。 LLVM GCC不支持Strong和其他ARC關鍵字。請將您的編譯器設置爲LLVM編譯器4.2