2009-07-27 14 views
46

मैं कोड निम्न प्रकार पर बजना त्रुटियों मिलती रहती है और मैं क्यों वे गलत कर रहे हैं को समझ नहीं सकता या कैसे बजना की संतुष्टि के लिए उन्हें हल करने के लिए:"संभावित नल अव्यवस्था" पर क्लैंग त्रुटि।

+ (NSString *)checkForLength: (NSString *)theString error: (NSError **)error { 
    BOOL hasLength = ([theString length] > 0); 
    if (hasLength) return theString; 
    else { 
     *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil]; 
     return nil; 
    } 
} 

की पूरी तरह से-काल्पनिक प्रकृति अलग छोड़कर उदाहरण (जो क्लैंग ने ऑब्जेक्ट करने के लिए ऑब्जेक्ट किया था), निम्नलिखित आपत्ति के साथ त्रुटि असाइनमेंट लाइन पर क्लैंग बाल्क:

संभावित शून्य अस्वीकृति। 'बनाना और रिटर्निंग NSError ऑब्जेक्ट्स' में कोडिंग मानकों के अनुसार पैरामीटर 'त्रुटि' शून्य हो सकती है।

मुझे एक प्राचीन क्लैंग रिपोर्ट पसंद है। मैंने उद्धृत दस्तावेज़ पढ़ा है और मुझे उम्मीद करने के लिए कोई रास्ता नहीं दिख रहा है; मैंने कुछ खुले स्रोत कोको पुस्तकालयों की जांच की और यह एक आम मुहावरे लगता है। कोई विचार?

उत्तर

95

अपेक्षित करने का तरीका उस दस्तावेज़ में 3-5 सूचीबद्ध करने में दिखाया गया है। अपने उदाहरण कोड के साथ:

+ (NSString *)checkForLength: (NSString *)theString error: (NSError **)error { 
    BOOL hasLength = ([theString length] > 0); 
    if (hasLength) return theString; 
    else { 
     if (error != NULL) *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil]; 
     return nil; 
    } 
} 
+1

उह, मुझे विश्वास नहीं है कि मुझे याद आया। धन्यवाद! – bbrown

+0

मैंने किसी भी क्रैश या विश्लेषक त्रुटियों/चेतावनियों के बिना, एक लाख बार 'if (त्रुटि) * त्रुटि = ... 'का उपयोग किया। क्या मैं इस तरह से जा रहा हूँ? –

+0

हां, 0 और झूठ के लिए एक नल पॉइंटर का स्पष्ट समतुल्य सार्थक सी से रखा गया कुछ उद्देश्य सी है। मुझे व्यक्तिगत रूप से लगता है कि यह खराब शैली है, लेकिन हाँ, यदि आप वास्तव में चाहते हैं तो आप आसानी से 'if (error)' का उपयोग कर सकते हैं। –

16

कोको सम्मेलन है कि वापसी मान सफलता या विफलता का संकेत देना चाहिए (इस मामले में, आप विफलता के लिए नहीं के बराबर वापसी) और त्रुटि अतिरिक्त जानकारी के साथ में भर जाता है, लेकिन केवल जब कॉलर अनुरोध करता है।

दूसरे शब्दों

NSError *error = nil; 
NSString *result = [self checkForLength: aString error: &error]; 

और

NSString *result = [self checkForLength: aString error: NULL]; 

में दोनों वैध विधि आह्वान करने के लिए तरीके हैं। तो विधि निकाय को हमेशा एक पूर्ण त्रुटि पैरा के लिए जांचना चाहिए:

if (error != NULL) 
    *error = ...; 
+0

असल में, अगर क्लैंग स्थिर विश्लेषक आपके दूसरे स्निपिट के बारे में शिकायत नहीं करता है, तो मैं एक बग फाइल करूंगा :-) –

+0

क्या आप स्निपेट का जिक्र कर रहे हैं जहां त्रुटि के लिए NULL पास हो गया है परम? यह एनएसईआरआरआर का उपयोग करने के लिए एक दस्तावेज पैटर्न है। । –

+0

अगर मैं दो उत्तरों को चिह्नित कर सकता था, तो मेरे पास होगा। संदर्भ में व्याख्या करने के लिए धन्यवाद जिसमें यह हो सकता है! – bbrown

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