Như Kevin cho biết, nếu bạn đang sử dụng ARC tại bất kỳ điểm nào trong dự án thư viện tĩnh của bạn, nó sẽ chỉ tương thích với LLVM Compiler 3.0 trở lên. Tuy nhiên, nếu bạn muốn tạo một khung sử dụng tính năng tham chiếu thủ công, có thể sử dụng trong dự án có hỗ trợ ARC và tương thích với các trình biên dịch cũ hơn, bạn có thể cần phải thiết lập một số trình biên dịch xác định. Chúng tôi đã phải làm điều này cho khung cốt lõi cốt lõi để làm cho các tiêu đề cho khuôn khổ đó tương thích trên các dự án ARC và không ARC được xây dựng bằng cách sử dụng một loạt các trình biên dịch và mục tiêu.
Để làm điều này, tôi vẽ từ Ryan Petrich của ZWRCompatibility, mà ông mô tả trong câu trả lời của ông here, và lắp ráp các định nghĩa sau đây:
#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
này cho phép bạn tham khảo giữ lại phi (giao) biến dụ như sau đây:
__cpt_weak CPTAnnotationHostLayer *annotationHostLayer;
với định nghĩa bất động sản kết hợp của
@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer;
Đối với các mục tiêu của iOS 5.0 và Lion sử dụng LLVM Compiler 3.0, điều này làm cho các thuộc tính này sử dụng vòng loại an toàn hơn __weak
. Đối với iOS 4.0 và Snow Leopard trong LLVM Compiler 3.0, điều này chuyển thành __unsafe_unretained
. Cuối cùng, đối với bất kỳ trình biên dịch nào khác, bộ định danh trống và thuộc tính được đặt thành assign
.
retain
có thể được sử dụng cho các thuộc tính mà không có nhiều vấn đề trên tất cả các trình biên dịch.
Nguồn
2011-12-21 18:55:49
Ah, cũng giống như lưu ý thêm, tôi sẽ chuyển các thư viện tĩnh. Tôi tin rằng tất cả mọi thứ nên được OK sau đó, bởi vì tôi đang biên soạn bằng cách sử dụng Clang. Tất cả những gì tôi cần làm là đảm bảo tôi sử dụng giữ lại trong các tập tin tiêu đề của tôi. Suy nghĩ? – jimothy
@jimothy: Trừ khi bạn có một lý do thực sự tốt để hỗ trợ GCC, tôi muốn nói bạn chỉ nên yêu cầu Clang. –