2010-06-29 16 views
25

में एक विशिष्ट पंक्ति में एक विशिष्ट चेतावनी को अक्षम करना मैं बेस 4.0 एसडीके के खिलाफ एक आईफोन ऐप लिख रहा हूं, लेकिन मैं ओएस 3.1.3 को लक्षित कर रहा हूं ताकि ओएस 3 उपयोगकर्ता ऐप का उपयोग कर सकें।एक्सकोड

मैं फोन:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

जो आईओएस 4.0 में मान्य नहीं है। मैं इसके बारे में जानता हूं, और यदि हम आईओएस 4.0 या उससे अधिक के तहत चल रहे हैं तो नए "एनीमेशन" संस्करण को कॉल करने के लिए उपाय हैं।

हालांकि, मुझे एक चेतावनी मिल रही है कि मैं एक बहिष्कृत एसडीके को बुला रहा हूं।

मैं इस विशिष्ट स्थान में इस विशिष्ट चेतावनी को अक्षम करना चाहता हूं। मैं अन्य सभी चेतावनियों (अन्य स्थानों में एक ही बहिष्कृत चेतावनी सहित) चाहता हूं

क्या यह एक्सकोड में पूरा किया जा सकता है?

उत्तर

71

बजना के लिए, यह काम करता है:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    // Here I like to leave a comment to my future self to explain why I need this deprecated call 
    NSString *myUDID = [[UIDevice currentDevice] uniqueIdentifier]; 
#pragma clang diagnostic pop 

आप इसे एक विधि है, जो आप लाइन का कारण बनता है कि चेतावनी आप चाहते हैं पर ध्यान नहीं दिया है, के बारे में बहुत विशिष्ट होने की अनुमति देता के अंदर उपयोग कर सकते हैं।

+0

यह बहुत अच्छा काम करता है, धन्यवाद – elsurudo

+7

यह वास्तव में सही उत्तर के रूप में चिह्नित किया जाना चाहिए। यह थोड़ा हैकी है और थोड़ा क्लीनर होने के अलावा, संकलन समय पर समस्या हल करता है। –

+0

+1 क्लैंग के सही उपयोग के लिए +1, यह जवाब होना चाहिए, एनएसआईएनवोकेशन एक हैक –

19

आप जीसीसी प्रागमा का उपयोग करने में सक्षम हो सकते हैं। इसे संलग्न कार्य के लिए बहिष्कृत चेतावनी को अक्षम करना चाहिए।

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated" 
-(void)foo{ 
    // As Georg Fritzsche notes below, the pragmas only work outside of functions 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
} 
#pragma GCC diagnostic pop 

मैं अगर यह बजना के साथ काम करेंगे पता नहीं है, लेकिन यह चाहिए जीसीसी के साथ काम करते हैं।

असल में, यह चेतावनियों/त्रुटियों की स्थिति को बचाता है, बहिष्कृत चेतावनी को अक्षम करता है, फ़ंक्शन को संकलित करता है, फिर निदान की स्थिति को पुनर्स्थापित करता है।

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
NSMethodSignature *sig = [app methodSignatureForSelector:sel]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL b = YES; 
[inv setTarget:app]; 
[inv setSelector:sel]; 
[inv setArgument:&b atIndex:2]; 
[inv setArgument:&b atIndex:3]; 
[inv invoke]; 

या एक त्रुटि-रहित सहिष्णु तरह से:

+1

उन प्रागम्स को कार्यों के अंदर अनुमति नहीं है, उन्हें कुछ सहायक कार्य को घेरना होगा। –

+0

धन्यवाद। यह वास्तव में काम नहीं किया था। ऐसा लगता है कि 'पुश' और 'पॉप' कीवर्ड वैध नहीं हैं, क्योंकि उन्होंने अपनी चेतावनियां उत्पन्न की हैं। –

+0

कोई प्रभाव नहीं। – Jonny

8

आप चेतावनी संकलक की स्वतंत्र रूप से किया चारों ओर पाने के लिए उपयोग कर सकते हैं NSInvocation

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
IMP imp = [app methodForSelector:sel]; 
imp(app, sel, YES, YES); 
+1

'[एनएसएमआईडी हस्ताक्षर हस्ताक्षर WithObjCTypes:" v @ cc "]' '[[UIAplplication sharedAplication] विधि सिग्नेचरफोर चयनकर्ता के साथ प्रतिस्थापित किया जा सकता है: @selector (setStatusBarHidden)] 'इसे पढ़ने में आसान बनाने के लिए? –

+0

बिल्कुल, ज़ाहिर है। –

+0

एक इलाज करता है। धन्यवाद। –

4

आप पर काबू पाने के इस तरह यह प्रदर्शन कर सकते हैं एक बार

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
(void) methodUsingDeprecatedStuff { //use deprecated stuff } 

या

01 पर चेतावनियां

बस हर बार

अपने पदावनत सामान का उपयोग कर से बचने के लिए चेतावनी

#pragma जीसीसी नैदानिक ​​चेतावनी "-Wdeprecated-घोषणाओं" इस चेतावनी निकाल देंगे से पहले इस लाइन पेस्ट करें।

आशा है कि यह आपकी मदद करेगा।