Как указывает Кевин, если вы используете ARC в любой точке проекта статической библиотеки, он будет совместим только с LLVM Compiler 3.0 и выше.
Однако, если вы хотите создать платформу, которая использует ручной подсчет ссылок, но при этом может использоваться в проекте с поддержкой ARC и совместима со старыми компиляторами, вам может потребоваться настроить некоторые определения компилятора. Мы должны были сделать это для платформы Core Plot, чтобы заголовки этой платформы были совместимы между ARC и не-ARC проектами, созданными с использованием различных компиляторов и целей.
Для этого я взял из совместимости Райана Петрича *1006*, которую он описывает в своем ответе здесь , и собрал следующие определения:
#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;
Для целей iOS 5.0 и Lion, использующих LLVM Compiler 3.0, эти свойства используют более безопасный классификатор __weak
. Для iOS 4.0 и Snow Leopard под LLVM Compiler 3.0 это превращается в __unsafe_unretained
. Наконец, для любого другого компилятора квалификатор пуст и свойство имеет значение assign
.
retain
можно использовать для свойств без особых проблем во всех компиляторах.