2011-02-07 9 views
70

में एक विधि को कैसे हटाया जाए, हमारे पास हमारी लाइब्रेरी है जो हम अपने ग्राहकों को भेजते हैं, और मैं कुछ विधियों को "बहिष्कृत" के रूप में चिह्नित करना चाहता हूं क्योंकि हमने उन्हें बदल दिया है (जैसे ऐप्पल आईफोन एसडीके में करता है)।एक्सकोड

मैं __OSX_AVAILABLE_BUT_DEPRECATED पूर्व प्रोसेसर मैक्रो, जो __AVAILABILITY_INTERNAL को मैप किया है, जो __attribute__((deprecated)) को मैप किया है देखा है ...

खैर मैं इस सामान के साथ एक सा उलझन में हूँ!

कोई भी इसके बारे में कुछ जानता है?

उत्तर

141

__attribute__((deprecated))gcc way (supported in clang) को फ़ंक्शन/विधि को बहिष्कृत करने के लिए चिह्नित करने के लिए) है। जब किसी को "बहिष्कृत" के रूप में चिह्नित किया जाता है, तो जब भी कोई इसे कॉल करता है तो एक चेतावनी उत्पन्न की जाएगी।

सामान्य कार्यों के लिए वाक्यविन्यास होगा

__attribute__((deprecated)) 
void f(...) { 
    ... 
} 

// gcc 4.5+/clang 
__attribute__((deprecated("g has been deprecated please use g2 instead"))) 
void g(...) { 
    ... 
} 

और ऑब्जेक्टिव-सी विधियों में से है कि हो सकता है

@interface MyClass : NSObject { ... } 
-(void)f:(id)x __attribute__((deprecated)); 
... 
@end 

तुम भी पूरी कक्षा के रूप में चिह्नित कर सकते हैं

__attribute__((deprecated)) 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 
साथ पदावनत

ऐप्पल भी <AvailabilityMacros.h> शीर्षलेख प्रदान करता है जो DEPRECATED_ATTRIBUTE और DEPRECATED_MSG_ATTRIBUTE (msg) मैक्रोज़ प्रदान करता है जो उपर्युक्त विशेषताओं में विस्तारित करते हैं, या कुछ भी नहीं यदि संकलक विशेषता का समर्थन नहीं करता है। ध्यान दें कि यह हेडर ओएस एक्स/आईओएस के बाहर मौजूद नहीं है।


साइड ध्यान दें, यदि आप स्विफ्ट का उपयोग कर रहे आप @available attribute का उपयोग करता है, उदा एक आइटम का बहिष्कार करना

@available(*, deprecated=2.0, message="no longer needed") 
func f() { 
    ... 
} 
+0

इस तेजी से उत्तर के लिए धन्यवाद, मैं बहुत यकीन है कि यह मदद मिलेगी हूँ मैं :) – Julien

+1

पूछ मैं सिर्फ दूसरा प्रश्न है, इससे पहले कि थोड़ी देर के लिए खोज:

दस्तावेज़ देखें यह संदेश जोड़ना संभव है जैसे "विधि का उपयोग करें XXX" की तरह? – Julien

+21

@ जुलिएन: हां: '__attribute ((बहिष्कृत (इसके बजाय विधि का उपयोग XXX)) '। लेकिन यह वाक्यविन्यास केवल जीसीसी 4 से शुरू होता है।5, और एक्सकोड के साथ भेजे गए संस्करण 4.2 है ... – kennytm

64

तुम भी अधिक पठनीय उपयोग कर सकते हैं परिभाषितDEPRECATED_ATTRIBUTE

यह usr/include/AvailabilityMacros.h में परिभाषित:

#define DEPRECATED_ATTRIBUTE  __attribute__((deprecated)) 
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg)))) 

ऑब्जेक्टिव-सी तरीकों उदाहरण:

@interface MyClass : NSObject { ... } 
-(void)foo:(id)x DEPRECATED_ATTRIBUTE; 

// If you want to specify deprecated message: 
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead."); 
... 
@end 
,210

तुम भी पदावनत के रूप में पूरी कक्षा चिह्नित कर सकते हैं:

DEPRECATED_ATTRIBUTE 
@interface DeprecatedClass : NSObject { ... } 
... 
@end 
+2

ऐप्पल आईओएस कक्षाओं में भी ऐसा करता है। शायद बेहतर तरीका। – LunaCodeGirl

+2

यह निश्चित रूप से बेहतर तरीका है। करुणा यह चयनित उत्तर नहीं है, या उच्च वोट दिया गया जवाब है। – Benjohn

+0

संदेश के साथ बहिष्कृत किए गए वर्ग को चिह्नित करने के लिए मैं 'DEPRECATED_MSG_ATTRIBUTE' का उपयोग कैसे कर सकता हूं (जैसे UIAlertView) – Multinerd

1

आप अपने Xcode प्रोजेक्ट में सी ++ 14 का उपयोग कर रहे हैं, तो आप भी [[deprecated]] या [[deprecated("reason")]] विशेषता अब भाषा का हिस्सा है कि प्रयोग कर सकते हैं। , http://en.cppreference.com/w/cpp/language/attributes