2012-06-07 11 views
8

w tym samym pliku chcemy napisać kod, który obsługuje ARC i nie ARC. Do tego potrzebne jest trochę makr.Makro, aby dowiedzieć się, czy ARC włączone, czy nie w Xcode 4.3.2

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

Jak uzyskać to makro, Czy dostępne są makra? Proszę dać mi znać. Podziękowania za wsparcie Uwaga: ARC_ENABLED Właśnie napisałem na przykład:

+0

możliwe duplikat [warunkowej kompilacji przy użyciu ARC] (http://stackoverflow.com/questions/8447090/conditional-compilation-when-using-arc) – kennytm

+0

możliwy duplikat [Jak programowo wykryć automatyczne liczenie odwołań?] (http://stackoverflow.com/questions/10700661/how-to- programowo wykrywa automatyczne liczenie odwołań) –

Odpowiedz

25

Istnieje obiektyw makro C __has_feature, można go użyć do sprawdzenia, czy łuk jest włączony dla nie.

Od Clang Language Extension documentation

licząc Automatyczne odniesienia

Clang zapewnia wsparcie dla automatycznego zliczania odniesienia w Objective-C, co eliminuje potrzebę ręcznego zachować/release/autorelease wiadomość wysyła. Istnieją dwa makra fabularne związane z automatycznego zliczania odniesienia: __has_feature(objc_arc) wskazuje dostępność automatycznego zliczania odniesienia w ogóle, podczas gdy __has_feature(objc_arc_weak) wskazuje, że liczenie zautomatyzowane referencyjna obejmuje również wsparcie dla __weak wskaźniki do obiektów Objective-C.

Sekcja Feature checking macro's to bardzo dobra lektura.

Można go używać tak ..

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

Część kodu bezczelnie skopiowane z this answer.

+0

+1 dla "bezwstydu" = D –

+0

@Krishnabhadra, jak zdefiniować __has_feature (objc_arc), zrobiłem coś jak poniżej #ifndef __has_feature #define __has_feature (x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature // Kompatybilność z kompilatorami przed 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) Ale wydaje się, że nie działa, użyłem zachowaj i zwolnij po włączeniu ARC w projekcie, daje błąd – Ajay

+0

Dzięki temu działa dobrze. – Ajay

2

Poniższa zdefiniuje USING_ARC, USING_MRC & USING_GC być 0 lub 1, wraz z kilkoma kontrolami Sanity:

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

miejsce, które w odpowiednim ncurses.h zawartych w projekcie .pch

Teraz możesz #if USING_x kontrolować kompilację warunkową w dowolnym miejscu.

Ponadto można wykluczyć niektóre pliki z kompilacji w pewnych modelach pamięć o tym, na przykład, na początku pliku:

#if USING_GC | USING_ARC 
    #error "Sorry, this file only works with MRC" 
#endif 
Powiązane problemy