在同一个文件中,我们要编写支持ARC和非ARC的代码。为此,需要一些宏。
#ifdef ARC_ENABLED
NSLog(@" ARC enabled ");
#else
NSLog(@" ARC disabled ");
[self release];
#endif
如何实现这个宏,有没有可用的宏?请让我知道。提前感谢支持注意:ARC_ENABLED 只是我写过的例子
客观的C宏__has_feature
,你可以用它来检查arc是否启用了not。
来自 Clang 语言扩展文档
自动引用计数
Clang在 中提供对自动引用计数的支持 Objective-C,无需手动操作 保留/释放/自动释放消息发送。有两个功能宏 与自动引用计数相关联:
__has_feature(objc_arc)
表示自动化的可用性 一般参考计数,而__has_feature(objc_arc_weak)
指示自动引用计数还包括对__weak
指向 Objective-C 对象的指针。
功能检查宏部分是一个很好的阅读。
你可以这样使用它..
#if !__has_feature(objc_arc)
//Do manual memory management...
#else
//Usually do nothing...
#endif
代码部分无耻地从这个答案中复制而来。
下面将USING_ARC
、USING_MRC
和USING_GC
定义为 0 或 1,并进行一些健全性检查:
// Utility macros (undefined below)
#define PREFIX_ONE(a) 1##a
#define EMPTY_DEFINE(a) (PREFIX_ONE(a) == 1)
// Memory management kind
#if !defined(USING_GC)
# if defined(__OBJC_GC__)
# define USING_GC 1
# else
# define USING_GC 0
# endif
#elif EMPTY_DEFINE(USING_GC)
# undef USING_GC
# define USING_GC 1
#endif
#if !defined(USING_ARC)
# if __has_feature(objc_arc)
# define USING_ARC 1
# else
# define USING_ARC 0
# endif
#elif EMPTY_DEFINE(USING_ARC)
# undef USING_ARC
# define USING_ARC 1
#endif
#if !defined(USING_MRC)
# if USING_ARC || USING_GC
# define USING_MRC 0
# else
# define USING_MRC 1
# endif
#elif EMPTY_DEFINE(USING_MRC)
# undef USING_MRC
# define USING_MRC 1
#endif
// Remove utility
#undef PREFIX_ONE
#undef EMPTY_DEFINE
// Sanity checks
#if USING_GC
# if USING_ARC || USING_MRC
# error "Cannot specify GC and RC memory management"
# endif
#elif USING_ARC
# if USING_MRC
# error "Cannot specify ARC and MRC memory management"
# endif
#elif !USING_MRC
# error "Must specify GC, ARC or MRC memory management"
#endif
#if USING_ARC
# if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
# error "ARC requires at least 10.6"
# endif
#endif
将其放在您的项目 .pch 中包含的合适 .h 中
现在,您可以在任何位置#if USING_x
控制条件编译。
此外,您还可以通过包括例如在文件顶部来排除某些文件在某些内存模型下编译:
#if USING_GC | USING_ARC
#error "Sorry, this file only works with MRC"
#endif