2012-06-07 16 views
8

nello stesso file vogliamo scrivere codice che supporti ARC e non ARC. Per quello alcune macro richieste.Macro per sapere se ARC è abilitato o meno in Xcode 4.3.2

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

Come ottenere questa macro, Qualche tipo di macro disponibile? Per favore fatemi sapere. Anticipazioni per il supporto Nota: ARC_ENABLED Ho appena scritto ad esempio

+0

possibile duplicato del [compilazione condizionale quando si utilizza ARC] (http://stackoverflow.com/questions/8447090/conditional-compilation-when-using-arc) – kennytm

+0

possibile duplicato di [Come rilevare automaticamente il conteggio dei riferimenti automatici?] (http://stackoverflow.com/questions/10700661/how-to- conteggio programmatico-rilevamento-automatico-riferimento) –

risposta

25

C'è una macro C oggettiva __has_feature, è possibile utilizzarla per verificare se l'arco è abilitato per non.

Da Clang Language Extension documentation

riferimento di conteggio automatico

Clang fornisce il supporto per il conteggio dei riferimenti automatizzato Objective-C, che elimina la necessità di manuale di mantenere/release/messaggio autorelease manda. Ci sono due funzionalità macro associati riferimento conteggio automatico: __has_feature(objc_arc) indica la disponibilità di conteggio riferimento automatizzato in generale, mentre __has_feature(objc_arc_weak) indica che il conteggio di riferimento automatizzato include anche il supporto per __weak puntatori a oggetti Objective-C.

La sezione Feature checking macro's è una lettura molto buona.

è possibile utilizzarlo come questo ..

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

La parte di codice spudoratamente copiato da this answer.

+0

+1 per lo "spudorato" = D –

+0

@Krishnabhadra, come definire __has_feature (objc_arc), ho fatto qualcosa di simile sotto #ifndef __has_feature #define __has_feature (x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature // Compatibilità con i compilatori precedenti alla 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) Ma sembra che non funziona, ho usato conservare e rilasciare quando ho abilitato ARC in progetto, dà errore – Ajay

+0

Grazie funziona bene. – Ajay

2

Di seguito definirà USING_ARC, USING_MRC & USING_GC a 0 o 1, insieme ad alcuni controlli di integrità:

// 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 che in un .h adatto inclusi nel progetto PCH

È ora possibile #if USING_x controllare la compilazione condizionale ovunque.

Inoltre è possibile escludere alcuni file da compilare in determinate modelli di memoria, includendo, ad esempio, nella parte superiore del file:

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