मैं उद्देश्य-सी 2.0 में पदावनत विधि को कैसे ध्वजांकित करूं?


141

मैं एक काफी बड़े iPad ऐप को विकसित करने वाली टीम का हिस्सा हूं और इसके परिणामस्वरूप कई अलग-अलग वर्ग हैं। परेशानी कुछ तरीके हैं जो अब बहुत अधिक अप्रचलित हैं और मैं नहीं चाहता कि बस उन्हें हटा दें क्योंकि मुझे पता है कि समग्र प्रणाली के कुछ हिस्से विधियों का उपयोग करते हैं ... लेकिन बेहतर (नए) संस्करण उपलब्ध हैं जिनका उपयोग किया जाना चाहिए इसके बजाय (पुराने में से कुछ वास्तव में नए लोगों को बुलाते हैं, लेकिन समग्र वर्ग इंटरफ़ेस गड़बड़ हो रहा है)।

क्या कोई ऐसा तरीका है जिसमें मैं कुछ विधियों को मूल्यह्रास के रूप में चिह्नित कर सकता हूं (जैसे @deprecatedजावा और [Obsolete].NET में)।

मैं देख रहा हूं कि Apple उपलब्धता का उपयोग करता है। h और जैसे टैग हैं

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... क्या ऐसा करने का एकमात्र तरीका है (+ क्या यह ऐप स्टोर ऐसा करने के लिए सुरक्षित है?) या क्या ऐसे विकल्प हैं जो Xcode में चेतावनी को चिह्नित करेंगे?

जवाबों:


163

डिप्रेसेशन सिंटेक्स

सिंटैक्स को विधि के रूप में चिह्नित करने के लिए प्रदान किया जाता है:

@interface SomeClass
-method __attribute__((deprecated));
@end

या:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
यह मैक्रो मुझे समझ में आता है, यह __attribute__सिंटैक्स की भावना को बनाए रखता है । #define __deprecated__ __attribute__((deprecated))
ज़ेकेल

दिलचस्प रूप से एक्सकोड मुझे एक विधि के रूप में चिह्नित करने के लिए कोई चेतावनी नहीं देता है जो मूल्यह्रास के रूप में चिह्नित है। क्या एक संकलक ध्वज है जिसे सेट करने की आवश्यकता है?
18

Xcode के कोड के पूरा होने के बाद, मैं देखता हूं कि विधि को मूल्यह्रास के रूप में चिह्नित किया गया है, लेकिन इसका उपयोग करने से कंपाइलर चेतावनी नहीं देता है।
मेमन

1
@Answerbot सेटिंग सेट करें> पदावनत कार्यों के बारे में चेतावनी दें ... इसे YES में सेट करें
bandejapaisa

वैकल्पिक विधि को कैसे जोड़ा जाए जिसका उपयोग किया जाना चाहिए?
OXXY

135

IMHO, __deprecated लिखना आसान है:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;

कक्षाओं पर भी काम करता है

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end

2
इसे करने का बहुत बेहतर तरीका है।
एसजी 1

1
कोई विवरण नहीं दिया गया है, इसलिए आपको पता नहीं चलेगा कि आपको अलग-अलग विधि का उपयोग करना चाहिए या क्या ...
raistlin

1
#define __deprecated __attribute __ ((पदावनत))
पराग बाफना

इससे बेहतर क्यों है DEPRECATED_ATTRIBUTE? सिर्फ इसलिए कि यह छोटा है या कोई वास्तविक अंतर है?
केलीन

88

यदि आप अतिरिक्त ध्वज के साथ अतिरिक्त संदेश देना चाहते हैं, तो आप निम्न ध्वज का उपयोग कर सकते हैं।

@property (strong, nonatomic) NSString *catName
                    __deprecated_msg("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    DEPRECATED_MSG_ATTRIBUTE("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    __attribute__((deprecated("use name instead.")));

उपर्युक्त झंडों का उपयोग करते हुए, आप बता सकते हैं कि आप क्यों पदावनत कर रहे हैं या भविष्य में किस विधि का उपयोग करना चाहिए।


2
मैं एक डिप्रेसन चेतावनी के साथ एक संदेश रखना पसंद करता हूं। यह एपीआई के नए उपयोगकर्ताओं के लिए बहुत अधिक उपयोगी है। इसलिए, मुझे लगता है कि यह सबसे अच्छा जवाब है।
जॉनीनब

मुझे यह उत्तर सबसे अच्छा लगता है, मुझे जो चाहिए उसकी कॉपी-पेस्ट के साथ उपयोग करने के लिए सबसे स्पष्ट और आसान है। क्या आप कृपया इसे एक विधि को चित्रित करने के नमूने के साथ भी बढ़ा सकते हैं? एक पूरी कक्षा? क्या यह ठीक उसी तरह किया जाता है?
मत्ती श्नोर

15

पदावनत के रूप में एक विधि को चिह्नित करने के लिए, __attribute __ (((आपका संदेश यहां जाता है)) का उपयोग करें)

मेंटल से एक व्यावहारिक उदाहरण

@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)

+ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
+ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));

@end

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.