2012-06-07 12 views
8

उसी फ़ाइल में हम कोड लिखना चाहते हैं जो एआरसी और गैर-एआरसी का समर्थन करता है। इसके लिए कुछ मैक्रो आवश्यक है।मैक्रो यह जानने के लिए कि क्या एआरसी सक्षम है या नहीं, एक्सकोड 4.3.2

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

इस मैक्रो को कैसे प्राप्त करें, क्या कोई भी प्रकार का मैक्रो उपलब्ध है? कृपया मुझे बताएं। समर्थन के लिए अग्रिम धन्यवाद नोट: ARC_ENABLED बस मैंने उदाहरण के लिए लिखा है

+0

के संभावित डुप्लिकेट [सशर्त संकलन का उपयोग करते समय एआरसी] (http:/

इसके अलावा, आप बाहर कुछ फ़ाइलें, शामिल करके कुछ स्मृति मॉडल के तहत संकलन उदाहरण के लिए से, फ़ाइल के शीर्ष पर शासन कर सकते हैं /stackoverflow.com/questions/8447090/conditional-compilation-when-using-arc) – kennytm

+0

संभावित डुप्लिकेट [स्वचालित रूप से स्वचालित संदर्भ गिनती का पता लगाने के लिए कैसे करें?] (http://stackoverflow.com/questions/10700661/how-to- प्रोग्रामेटिक-डिटेक्ट-ऑटोमैटिक-रेफरेंस-गिनती) –

उत्तर

25

एक उद्देश्य सी मैक्रो __has_feature है, आप इसका उपयोग यह जांचने के लिए कर सकते हैं कि आर्क सक्षम नहीं है या नहीं।

Clang Language Extension documentation

से स्वत: संदर्भ गिनती

बजना ऑब्जेक्टिव-सी है, जो मैनुअल बनाए रखने/रिलीज/autorelease संदेश भेजता है की आवश्यकता समाप्त में स्वचालित संदर्भ गिनती के लिए सहायता प्रदान करता है। वहाँ दो सुविधा मैक्रो स्वत: संदर्भ गिनती के साथ जुड़े रहे हैं: __has_feature(objc_arc) इंगित करता है सामान्य रूप में स्वचालित संदर्भ गिनती की उपलब्धता है, जबकि __has_feature(objc_arc_weak) इंगित करता है स्वचालित संदर्भ गिनती भी ऑब्जेक्टिव-सी वस्तुओं के लिए __weak संकेत के लिए समर्थन शामिल है।

अनुभाग Feature checking macro's एक बहुत अच्छा पढ़ा है।

आप इस तरह उपयोग कर सकते हैं ..

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

बेशर्म this answer से नकल कोड हिस्सा।

+0

"शर्मनाक" = डी –

+0

@ कृष्णाभद्र के लिए +1, __has_feature (objc_arc) को परिभाषित करने के लिए, मैंने #ifndef __has_featureसे नीचे कुछ किया#define __has_feature (x) 0 #endif #ifndef __has_extension # परिभाषित करें __has_extension __has_feature // प्री-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) लेकिन यह यह काम नहीं करता है, मैं का इस्तेमाल किया है प्रोजेक्ट में एआरसी सक्षम करते समय बनाए रखें और रिलीज़ करें, त्रुटि – Ajay

+0

त्रुटि देता है धन्यवाद यह ठीक काम करता है। – Ajay

2

निम्नलिखित USING_ARC परिभाषित करेगा, USING_MRC & USING_GC 0 या 1, कुछ विवेक चेकों के साथ होने के लिए:

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

प्लेस कि एक उपयुक्त ज में अपनी परियोजना में शामिल .pch

अब आप सशर्त संकलन को नियंत्रित करने के लिए #if USING_x कर सकते हैं।

#if USING_GC | USING_ARC 
    #error "Sorry, this file only works with MRC" 
#endif 
संबंधित मुद्दे