正如凱文所示,如果您在靜態庫項目中的任何位置使用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
可用於所有編譯器中沒有太多問題的屬性。
嗯,就像進一步的說明一樣,我將運送靜態庫。我相信一切都應該沒問題,因爲我正在使用Clang進行編譯。我需要做的就是確保在頭文件中使用retain。思考? – jimothy 2011-12-21 01:52:48
@jimothy:除非你有很好的理由來支持GCC,否則我會說你應該只是要求Clang。 – 2011-12-21 02:08:42