Alex Rivera | Logout

Macro to know whether ARC enabled or not in Xcode 4.3.2

Asked 2012-06-07T10:39:17.690
11

in same file we want to write code which supports ARC and non-ARC. For that some macro required.

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

How to achieve this macro, Does any kind of macro available? Please let me know. Advance thanks for support Note: ARC_ENABLED Just i have written for example

Edit
Report

1 Answer

2

The following will define USING_ARC, USING_MRC & USING_GC to be 0 or 1, along with a few sanity checks:

// 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

Place that in a suitable .h included in your project .pch

You can now #if USING_x to control conditional compilation anywhere.

Also you can rule out some files from compiling under certain memory models by including, for example, at the top of the file:

#if USING_GC | USING_ARC
   #error "Sorry, this file only works with MRC"
#endif
answered 2012-06-07T20:20:11.627

Your Answer