Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Macro to know whether ARC enabled or not in Xcode 4.3.2

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

like image 808
Ajay Avatar asked Jun 07 '12 10:06

Ajay


2 Answers

There is an objective C macro __has_feature, you can use that to check whether arc is enabled for not.

From Clang Language Extension documentation

Automatic reference counting

Clang provides support for automated reference counting in Objective-C, which eliminates the need for manual retain/release/autorelease message sends. There are two feature macros associated with automatic reference counting: __has_feature(objc_arc) indicates the availability of automated reference counting in general, while __has_feature(objc_arc_weak) indicates that automated reference counting also includes support for __weak pointers to Objective-C objects.

The section Feature checking macro's is a very good read.

You can use it like this..

#if !__has_feature(objc_arc)
    //Do manual memory management...
#else
    //Usually do nothing...
#endif

The code part shamelessly copied from this answer.

like image 64
Krishnabhadra Avatar answered Nov 05 '22 22:11

Krishnabhadra


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
like image 28
CRD Avatar answered Nov 05 '22 21:11

CRD