2010-05-31 10 views
6

मैं चेतावनी मिलती है "स्वरूप नहीं एक स्ट्रिंग शाब्दिक और कोई प्रारूप तर्क" NSLog फोन पर निम्नलिखित ब्लॉक में:मुझे एनएसएलओजी पर चेतावनी मिलती है "प्रारूप स्ट्रिंग अक्षर और प्रारूप प्रारूप नहीं है" - मैं इसे दिए गए कोड में कैसे सही कर सकता हूं?

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog([NSString stringWithFormat:@"%d", buttonIndex]); 
} 

मैं एक और पोस्ट यहाँ पढ़ लिया है यह त्रुटि संदेश NSLog के एक असुरक्षित उपयोग इंगित करता है कि । क्या कोई मुझे इसके लिए उचित रूप से स्वरूपित स्ट्रिंग की दिशा में इंगित कर सकता है?

उत्तर

11

यह आपके मामले में तकनीकी रूप से एक अमान्य चेतावनी है, लेकिन यह आपको बता रहा है कि एनएसएलओजी के लिए आपकी प्रारूप स्ट्रिंग हार्ड-कोडेड नहीं है और यह सुरक्षा/स्थिरता समस्या हो सकती है। फिक्स सरल है:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSLog(@"%d", buttonIndex); 
} 

यदि आप उत्सुक हैं, तो सुरक्षा/स्थिरता समस्या से मेरा क्या मतलब है। मेरे उदाहरण में, NSLog के लिए प्रारूप स्ट्रिंग स्थिर है: @"%d", और आप जानते हैं कि जब आप इसे संकलित करते हैं तो NSLog एक पूर्णांक को पारित करने की अपेक्षा करेगा। जब आप NSLogNSLog([obj makeSomeString]) पर कॉल करते हैं, तो आप वास्तव में संकलन समय पर संकलित समय नहीं जानते हैं, या कितने/किस प्रकार के तर्कों का पालन करना चाहिए। यदि रन-टाइम पर स्ट्रिंग "%d %d %@" हो जाती है, तो यह किसी भी वस्तु को वास्तव में वहां रखा गया था या नहीं, इस पर ध्यान दिए बिना, यह खुशी से दो पूर्णांक और एनएसओब्जेक्ट को स्टैक से पढ़ेगा। यही समस्या है जो आपको चेतावनी दे रही है।

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

+0

अच्छी तरह से, "तकनीकी रूप से", चेतावनी वास्तव में मान्य है! एक गतिशील भाषा होने के नाते, रनटाइम पर 'stringWithFormat:' के कार्यान्वयन को बदलना संभव है, इसलिए आपके द्वारा उल्लेखित सभी मुद्दे अभी भी हो सकते हैं। इसके अलावा, आप स्ट्रिंग ऑब्जेक्ट को किसी समस्याग्रस्त व्यक्ति में बदल सकते हैं, शायद गलती से, लेकिन संकलक इसे जांच नहीं सकता है; इसलिए चेतावनी। – mohsenr

+0

एचएम, सच! तकनीकी तौर पर। : डी – alltom

संबंधित मुद्दे