2012-06-07 2 views
8

in der gleichen Datei wollen wir Code schreiben, die ARC und nicht-ARC unterstützt. Dafür ist ein Makro erforderlich.Makro zu wissen, ob ARC aktiviert oder nicht in Xcode 4.3.2

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

Wie erreicht man dieses Makro, Gibt es irgendeine Art von Makro verfügbar? Bitte lassen Sie es mich wissen. Vielen Dank für die Unterstützung Hinweis: ARC_ENABLED Nur ich habe zum Beispiel geschrieben

+0

möglich Duplikat [Bedingtes Kompilieren bei der Verwendung von ARC] (http://stackoverflow.com/questions/8447090/conditional-compilation-when-using-arc) – kennytm

+0

möglich Duplikat von [Wie programmgesteuert automatische Referenzzählung erkennen?] (http://stackoverflow.com/questions/10700661/how-to- programmatically-detect-automatic-reference-zähler) –

Antwort

25

Es gibt eine objektive C-Makro __has_feature, die Sie verwenden können, um zu überprüfen, ob Bogen für nicht aktiviert ist.

Von Clang Language Extension documentation

Automatische Referenzzählung

Clang Unterstützung für die automatische Referenzzählung liefert in Objective-C, die die Notwendigkeit für die manuelle beseitigt behalten/release/Autorelease-Nachricht sendet. Es gibt zwei Features-Makros mit automatischer Referenzzählung verbunden: __has_feature(objc_arc) die Verfügbarkeit von automatisierter im Allgemeinen Referenzzählung anzeigt, während __has_feature(objc_arc_weak) zeigt an, dass automatische Referenzzählung umfasst auch die Unterstützung für __weak Zeiger auf Objective-C-Objekte.

Der Abschnitt Feature checking macro's ist eine sehr gute Lese.

Sie können es wie folgt verwenden ..

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

Der Codeteil von this answer schamlos kopiert.

+0

+1 für die "schamlos" = D –

+0

@Krishnabhadra, wie zu definieren __has_feature (objc_arc), habe ich etwas wie unten #ifndef __has_feature #define __has_feature (x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature // Kompatibilität mit Pre-3.0-Compilern. #endif #if __has_feature (objc_arc) && __clang_major__> = 3 #define ARC_ENABLED 1 #else #define ARC_ENABLED 0 #endif // __has_feature (objc_arc) Aber es scheint, es nicht funktioniert, ich habe verwendet beibehalten und freigeben, wenn ich ARC im Projekt aktiviert habe, gibt Fehler – Ajay

+0

Danke, es funktioniert gut. – Ajay

2

Im Folgenden wird USING_ARC definieren, USING_MRC & USING_GC 0 oder 1 sein, zusammen mit ein paar Plausibilitätsprüfungen:

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

Platz, die in einem geeigneten .h in Ihrem Projekt enthalten PCH

Sie können nun #if USING_x die bedingte Kompilierung überall steuern.

Sie können auch einige Dateien ausschließen aus, indem unter bestimmten Speichermodellen kompilieren, zum Beispiel am Anfang der Datei:

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