Bạn có thể sử dụng __has_feature
, như vậy:
#if __has_feature(objc_arc)
// ARC is On
#else
// ARC is Off
#endif
Nếu bạn cũng muốn xây dựng với GCC (của Apple GCC không hỗ trợ ARC), bạn cũng có thể cần những điều sau đây để xác định trình biên dịch:
#if defined(__clang)
// It's Clang
#else
// It's GCC
#endif
cập nhật
kết hợp, họ sẽ mang hình thức chung:
#if defined(__clang)
#if !defined(__has_feature)
// idk when clang introduced this
#error This version of clang does not support __has_feature
#endif
#define MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION __has_feature(objc_arc)
#else
// for every compiler other than clang:
#if defined(__has_feature)
#error Another compiler supports __has_feature
#endif
#define MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION 0
#endif
Sau đó chỉ cần sử dụng MON_IS_ARC_ENABLED_IN_THIS_TRANSLATION
trong nguồn của bạn hoặc để biết thêm #define
s.
Nếu trình biên dịch bạn sử dụng thêm hỗ trợ, bạn sẽ phải thêm trường hợp cho điều đó (và lỗi trình biên dịch có khả năng sẽ gặp lỗi trong trường hợp này, vì nó có khả năng cấm sử dụng số lần truy cập).
Lưu ý rằng điều này có kiểm tra bổ sung để chứng minh cách người ta có thể (và nên) tránh xác định số nhận dạng dành riêng (dựa trên cuộc trò chuyện trong nhận xét). Nó không đầy đủ, nhưng là một cuộc biểu tình. Nếu bạn thấy mình viết có điều kiện __has_feature
kiểm tra thường xuyên, bạn có thể muốn xác định macro mới để làm giảm và đơn giản hóa các định nghĩa.
@Sulthan, có các trường hợp sử dụng hợp lý cho đối tượng địa lý. Giống như việc đảm bảo người dùng thư viện của bạn không chỉ lấy các nguồn hỗ trợ ARC của bạn và biên dịch chúng mà không cần hỗ trợ ARC, rò rỉ bộ nhớ khắp nơi (đã xảy ra với tôi cách đây vài ngày). Điều đó nói rằng, mẫu mã được đưa ra trong câu hỏi trông thực sự lộn xộn. – zoul
@zoul Bạn không bao giờ có thể chuẩn bị cho mọi thứ mà người dùng có thể làm. Trong trường hợp của bạn, một xác nhận đơn giản nếu ARC được bật là đủ.Cố gắng để có mã tương thích với cả ARC và MRC phải kết thúc bằng một mã rất phức tạp (hoặc lộn xộn), với khả năng đọc kém. Và mã không thể đọc được là khó khăn để duy trì. – Sulthan
Đồng ý, khẳng định là những gì tôi có trong tâm trí. – zoul