2011-12-21 25 views
9

Tôi có một dự án chứa một số tệp đang sử dụng ARC và một số tệp thì không. Những cái không có cờ trình biên dịch vô hiệu hóa ARC. Điều đó hoạt động tốt.Nhận "Dự kiến ​​thuộc tính thuộc tính trước 'strong'" khi biên dịch tệp ARC với LLVM-GCC

Tôi cũng muốn đảm bảo thư viện của mình biên dịch cho LLVM-GCC và cũng là Trình biên dịch LLVM.

tôi có một tài sản như thế này:

@property (strong, nonatomic) NSString *foo; 

Tuy nhiên, khi tôi biên dịch trong LLVM-GCC, tôi nhận được:

"Dự kiến ​​một thuộc tính tài sản trước khi 'mạnh mẽ'"

Nếu Tôi thay đổi mạnh mẽ để giữ lại, nó biên dịch tốt. Strong cũng hoạt động tốt trong LLVM Compiler.

Tôi đang thiếu gì? Không đồng nghĩa với việc giữ lại?

Trả lời

12

Bạn đang sử dụng trình biên dịch lỗi thời và hy vọng nó sẽ hỗ trợ các tính năng ngôn ngữ mới. Điều đó đơn giản là sẽ không xảy ra. Nếu bạn đang sử dụng các từ khóa được giới thiệu với ARC, bạn cần phải sử dụng Clang.

+0

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

+1

@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. –

7

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.

+0

Ví dụ của Apple trong Availability.h sử dụng hằng số thay vì kiểm tra macro có sẵn, vì vậy 'MAC_OS_X_VERSION_MIN_REQUIRED> = 1070' thay vì' được xác định (__ MAC_10_7) && (MAC_OS_X_VERSION_MIN_REQUIRED> = __MAC_10_7) '. –

0

Bạn đang sử dụng trình biên dịch sai. LLVM GCC không hỗ trợ Strong và các từ khóa ARC khác. Vui lòng đặt trình biên dịch của bạn là trình biên dịch LLVM 4.2

Các vấn đề liên quan