मैं Xcode में "अप्रयुक्त चर" चेतावनी से कैसे छुटकारा पा सकता हूं?


98

मैं ठीक से समझता हूं कि अप्रयुक्त चर चेतावनी क्यों होती है। मैं उन्हें सामान्य रूप से दबाना नहीं चाहता, क्योंकि वे ज्यादातर मामलों में अविश्वसनीय रूप से उपयोगी होते हैं। हालाँकि, निम्नलिखित (contrived) कोड पर विचार करें।

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode रिपोर्ट्स जो savedएक अप्रयुक्त चर है, जब निश्चित रूप से यह नहीं है। मुझे संदेह है कि NSAssert1यह एक मैक्रो है। NS_BLOCK_ASSERTIONSमैक्रो है नहीं परिभाषित है, तो उद्देश्य सी दावे निश्चित रूप से सक्षम हैं।

हालांकि यह किसी भी चीज को चोट नहीं पहुंचाता है, मुझे यह अस्वाभाविक और कष्टप्रद लगता है, और मैं इसे दबाना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है। चर को अपने आप में संकलित करने से संकलक चेतावनी से छुटकारा मिल जाता है, लेकिन अगर ऐसा मौजूद है, तो मैं इसे "सही" तरीके से करूंगा।

जवाबों:


107

अगर यह अभी भी नए LLVM संकलक में समर्थित है, तो मैं अनिश्चित हूं, लेकिन GCC में "अप्रयुक्त" विशेषता है जिसका उपयोग आप उस चेतावनी को दबाने के लिए कर सकते हैं:

BOOL saved __attribute__((unused)) = [moc save:&error];

वैकल्पिक रूप से (एलएलवीएम उपरोक्त का समर्थन नहीं करता है), आप चर घोषणा को एक अलग लाइन में विभाजित कर सकते हैं, यह गारंटी देते हुए कि चर का उपयोग "किया जाएगा" कि मैक्रो का विस्तार होता है या नहीं:

BOOL saved = NO;
saved = [moc save:&error];

107

Xcode 4.3.2 का उपयोग करना और पता चला कि यह काम करता है (कम लेखन)

BOOL saved __unused;

यह मेरे लिए काम नहीं करता है, मुझे चेतावनी मिलती है कि'saved' was marked as unused but was used
हीथ बॉर्डर

37

Xcode में आप "अप्रयुक्त चर" के लिए चेतावनी सेट कर सकते हैं। लक्ष्य के लिए "बिल्ड सेटिंग्स" पर जाएं और "अप्रयुक्त" शब्द के साथ फ़िल्टर करें

यहाँ एक स्क्रीनशॉट है: Builld Settings स्क्रीनशॉट

मेरा सुझाव है कि आप इसे केवल डीबग के लिए बदल दें। इस तरह आप अपने रिलीज़ संस्करण में कुछ भी याद नहीं करते हैं।


37
क्या आपने उस सवाल का हिस्सा याद किया जहां ग्रेगरी ने कहा था "मैं उन्हें सामान्य रूप से दबाना नहीं चाहती, क्योंकि वे ज्यादातर मामलों में अविश्वसनीय रूप से उपयोगी होते हैं"?
शेरम पेंडले

8
@ShermPendley भले ही, यह अभी भी उपयोगी है, इसने मेरे सवाल का जवाब दिया कि इसे विश्व स्तर पर कैसे बंद किया जाए।
रफ़ियन

9
बग्स को याद करने के लिए चेतावनियों को बंद करना एक शानदार तरीका है। मैं अत्यधिक के खिलाफ सलाह देते हैं।
ओरियन एल्जेनिल

2
@orionelenzil - ठीक है, हाँ और नहीं। झूठी सकारात्मकता के साथ एक वास्तविक इंटरफ़ेस समस्या है। यदि आप कोड का हिस्सा नहीं ले रहे हैं तो आप कोड लिखते समय चेतावनी को लगातार पॉप अप करते हैं। समय के साथ, यह आपको चेतावनी को अनदेखा करने के लिए प्रशिक्षित करेगा जिसका अर्थ है कि आप अधिक महत्वपूर्ण त्रुटियों को अच्छी तरह से याद कर सकते हैं। बेहतर होगा कि कोड के ब्लॉक में त्रुटि को सक्रिय रूप से संपादित किया जा सके।
टेकजेन

नमस्ते, अगर मैं नहीं सेट इसकी ठीक काम। लेकिन मेरी शंका है: मुझे डिबग और रिलीज़ नो सेट करना है केवल अप्रयुक्त चर: नहीं? मुझे कौन सा सेट करना है। अगर मैं पूरी तरह से कोई सेट करता हूं, तो रिलीज के दौरान इसकी कोई संभावना नहीं है?
एसआर नायक

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

ऐसे में कोशिश करें। यह मेरे लिए काम कर रहा है। यह आपके लिए भी काम करेगा।


यह मेरे लिए काम नहीं करता है, मुझे चेतावनी मिलती है कि'saved' was marked as unused but was used
हीथ बॉर्डर

15

वेरिएबल को चिन्हित करने का एकमात्र सरल और पोर्टेबल तरीका है ... इसका उपयोग करना।

BOOL saved = ...;
(void)saved; // now used

आप पहले से ही संकलित विशिष्ट एक्सटेंशन के साथ खुश हो सकते हैं, हालांकि।


2
मैं ऊपर वर्णित बदसूरत #pragma पर इसे पसंद करता हूं।
उत्तरी

1
हे भाई, अच्छा टिप
dimazava

13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

स्रोत


यह साफ दृष्टिकोण के बाद से यह उन #pragmas के बीच केवल चेतावनी को अक्षम करता है
cornr


5

आप "नहीं" LLVM कंपाइलर 2.0 "रिलीज" पर चेतावनी सेट कर सकते हैंयहां छवि विवरण दर्ज करें


4

यह वह तरीका है जिसे आप C में करते हैं और इसलिए Objective-C भी।

भले ही आपके पास चेतावनियाँ सक्षम न हों, लेकिन वापसी मूल्य को स्पष्ट रूप से नजरअंदाज करना एक अच्छा विचार है। यह अन्य डेवलपर्स को दिखाने के लिए भी जाता है, कि आप सिर्फ रिटर्न वैल्यू के बारे में नहीं भूले हैं - आपने वास्तव में इसे अनदेखा करने के लिए स्पष्ट रूप से चुना है।

(void)[moc save:&error];

संपादित करें: कंपाइलर जातियों को अनदेखा करते हैं void, इसलिए इसे प्रदर्शन को प्रभावित नहीं करना चाहिए - यह सिर्फ एक अच्छा स्वच्छ मानव एनोटेशन है।


कुछ संदर्भों में आप इस हैक का उपयोग उद्देश्य-सी कोड को संकलित करने के लिए कर सकते हैं। उपयोग करने (void)का सबसे स्पष्ट तरीका है, धन्यवाद!
दान रोसेनस्टार्क

1

इसे दो लाइनों तक ले जाएं। डिक्लेरेशन और डिफॉल्ट वैल्यू को अलग करें

BOOL enabled = NO;

// ...

BOOL enabled;

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