10

在同一个文件中,我们要编写支持 ARC 和非 ARC 的代码。为此需要一些宏。

#ifdef ARC_ENABLED 
NSLog(@" ARC enabled ");
#else
NSLog(@" ARC disabled ");
[self release];
#endif

如何实现这个宏,有没有可用的宏?请告诉我。提前感谢支持注意:ARC_ENABLED 只是我写的例子

4

2 回答 2

27

有一个客观的 C 宏__has_feature,您可以使用它来检查是否启用了弧。

来自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

代码部分无耻地从这个答案中复制。

于 2012-06-07T10:44:37.017 回答
2

以下将定义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
于 2012-06-07T20:20:11.627 回答