2012-06-07 19 views
8

en el mismo archivo que queremos escribir el código que admite ARC y no ARC. Para eso se requiere algo de macro.Macro para saber si ARC está habilitado o no en Xcode 4.3.2

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

Cómo lograr este macro, ¿Hay algún tipo de macro disponible? Por favor, hágamelo saber. Gracias anticipadas por el soporte Nota: ARC_ENABLED Acabo de escribir, por ejemplo

+0

posible duplicado de [compilación condicional al utilizar ARC] (http://stackoverflow.com/questions/8447090/conditional-compilation-when-using-arc) – kennytm

+0

posible duplicado de [¿Cómo detectar mediante programación el conteo automático de referencias?] (http://stackoverflow.com/questions/10700661/how-to- programmatically-detect-automatic-reference-counts) –

Respuesta

25

Hay un objetivo C macro __has_feature, puede usar eso para verificar si el arco está habilitado para no.

De Clang Language Extension documentation

recuento de referencias automática

Clang proporciona soporte para el recuento de referencias automatizado en Objective-C, lo que elimina la necesidad de manual de mensaje retener/release/autorelease envía. Hay dos macros característica asociados con el recuento de referencias automático: __has_feature(objc_arc) indica la disponibilidad de automatizado conteo referencia en general, mientras que __has_feature(objc_arc_weak) indica que el recuento de referencias automatizada también incluye soporte para __weak punteros a objetos Objetivo-C.

La sección Feature checking macro's es una muy buena lectura.

Usted puede utilizar de esta manera ..

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

La parte de código descaradamente copiado de this answer.

+0

+1 para el "desvergonzado" = D –

+0

@Krishnabhadra, cómo definir __has_feature (objc_arc), hice algo como a continuación #ifndef __has_feature #define __has_feature (x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature // Compatibilidad con compiladores anteriores a la 3.0. #endif #if __has_feature (objc_arc) && __clang_major__> = 3 #define ARC_ENABLED 1 #else #define ARC_ENABLED 0 #endif // __has_feature (objc_arc) Pero parece que no funciona, he utilizado retener y liberar cuando habilité ARC en el proyecto, da error – Ajay

+0

Gracias funciona bien. – Ajay

2

A continuación se definirá USING_ARC, USING_MRC & USING_GC a ser 0 o 1, junto con algunas comprobaciones de validez:

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

lugar que en un .h adecuado incluir en su proyecto .pch

Ahora puede #if USING_x para controlar la compilación condicional en cualquier lugar.

También se puede descartar algunos archivos de la compilación bajo ciertas modelos de memoria mediante la inclusión, por ejemplo, en la parte superior del archivo:

#if USING_GC | USING_ARC 
    #error "Sorry, this file only works with MRC" 
#endif 
Cuestiones relacionadas