2010-01-14 9 views
8

उदाहरण: NSManagedObjectContext की -save: विधि इस तरह घोषित किया जाता है:प्वाइंट (एनएसईआरआर **) त्रुटि क्या है?

- (BOOL)save:(NSError **)error 

के बाद से NSError पहले से ही एक वर्ग है, और एक सूचक गुजर वास्तव में -save: के कार्यान्वयन के अंदर इस वस्तु को संशोधित करने के प्रभाव, बिंदु क्या होता है यहाँ एक सूचक के लिए एक सूचक पास करने के लिए? लाभ/भावना क्या है?

प्रयोग उदाहरण:

NSError *error; 
if (![managedObjectContext save:&error]) { 
    // Handle the error. 
} 
+3

आपको उस उदाहरण में त्रुटि को प्रारंभ करना चाहिए – ergosys

+7

नहीं, त्रुटि को शून्य में शुरू करने की बिल्कुल आवश्यकता नहीं है। त्रुटि का मान विधि से वापस लौटने पर पूरी तरह से अनिर्धारित है ** जब तक ** विधि शून्य या नहीं लौटा दी गई हो। – bbum

+0

मैंने हमेशा एनएसईआरआरओर्स को शून्य करने के लिए शुरू किया था, लेकिन मुझे लगता है कि आंतरिक रूप से त्रुटियों को कैसे संभाला गया था, इसकी व्याख्या में मैं गलत था: http://rentzsch.tumblr.com/post/260201639/nserror-is-hard –

उत्तर

16

यदि आप अभी एक सूचक में पास हुए हैं, तो सभी विधि पहले से मौजूद एनएसईआरआर ऑब्जेक्ट को बदल सकती हैं जो आप इंगित कर रहे हैं।

पॉइंटर में पॉइंटर में गुजरकर, यह नई एनएसईआरआर ऑब्जेक्ट्स बना सकता है और आपको पॉइंटर के साथ छोड़ देता है जो उन्हें इंगित करता है।

+5

का क्रमबद्ध करें। यदि आप मौजूदा एनएसईआरआरआर के संदर्भ में पास हुए हैं, तो एनएसईआरआर कार्यान्वयन को उत्परिवर्तन का समर्थन करना होगा। यह एक पूरी तरह से अलग एपीआई अनुबंध होगा। अन्यथा, सही। – bbum

+0

मैंने इस प्रश्न पर उदाहरणों का प्रासंगिक सेट जोड़ा। http://stackoverflow.com/questions/16244597/nserror-returned-with-bad-address- क्यों – bbum

3

यह एक नया NSError आवंटित और सूचक को बदलने के लिए विधि बल्कि NSError संशोधित करने के लिए पहले से ही बताया-टू (क्या हुआ अगर यह काफी बड़ा नहीं है की तुलना में यह करने के लिए बात करने के लिए, की अनुमति देता है ?)

+0

मैं उलझन में हूँ। यदि आप पते में एक शून्य एनएसईआरआरआर में भेज रहे हैं, तो जब तक आप कोई नहीं बनाते, तब तक 'संशोधित' करने के लिए कोई एनएसईआरआरआर नहीं होता है। इसके अलावा, एनएसईआरआरआर अपरिवर्तनीय है, इसलिए आप ऊपर मैकमार्क के अनुसार इसे संपादित नहीं कर सकते हैं। काश मैं इन सभी विरोधाभासी उत्तरों का एहसास कर सकता हूं। –

3

लाभ यह है कि आपको NSError ऑब्जेक्ट बनाने की आवश्यकता नहीं है। प्रलेखन राज्यों के रूप में:

"। एक NSError ऑब्जेक्ट के लिए एक सूचक आप एक NSError ऑब्जेक्ट बनाने के लिए की जरूरत नहीं है।"

+0

क्या आप इस पर अधिक स्पष्टीकरण प्रदान कर सकते हैं, उदाहरण के साथ, क्योंकि मैकमार्क ऊपर बताता है कि 'एनएसईआरआरआर' अपरिवर्तनीय है, इसलिए आपका केवल एक बनाने के लिए पसंद है। मैं अनुमान लगा रहा हूं कि कॉलर को 'एनएसईआरआरआर' बनाने की आवश्यकता नहीं है, हालांकि, यदि कोई त्रुटि लौटाई जा रही है, तो निश्चित रूप से CALLED को 'एनएसईआरआरआर' बनाने की आवश्यकता है आपका उत्तर थोड़ा अस्पष्ट है। –

6

@Anon सही है। मैं जोड़ूंगा: यह अपवाद फेंकने की जगह त्रुटियों का उत्पादन करने के लिए कोको तरीका है।

अपने उदाहरण में, आप है:

NSError *error = nil; 
if (![managedObjectContext save:&error]) { 
    // Handle the error. 
} 

तुरंत बाद save: करने के लिए कॉल, यदि कोई त्रुटि होती थी, तो save: विधि एक नया NSError वस्तु बना लिया होगा, और अपने error चर बदल बात करने के लिए nil से नई त्रुटि ऑब्जेक्ट में। इस तरह आप NSError स्वयं ऑब्जेक्ट की जांच कर सकते हैं और इसके लिए उचित प्रतिक्रिया दे सकते हैं।

आईएमओ, यह एक अपवाद फेंकने से क्लीनर है (जो मेरे दर्शन में केवल तभी किया जाना चाहिए जब कुछ विनाशकारी और अप्राप्य होता है)।

12

कुछ लोगों को "आउट" पैरामीटर के रूप में संदर्भित किया जाता है।

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

शायद भ्रमित करने वाला यह है कि स्थानीय चर जो आप save: पर जा रहे हैं वह खुद ही एक सूचक है, इसलिए परिवर्तनीय प्रकार एक सूचक के लिए सूचक होता है।

नीचे की रेखा, यह एक स्थानीय चर के लिए एक सूचक है, और यह वही काम करता है कि स्थानीय चर int या NSError* है।

+0

अब बहुत समझ में आता है। सबको धन्यवाद! महान सामान ... – openfrog

+0

मुझे आपकी व्याख्या पसंद है लेकिन मैं अशिक्षित हूं कि कैसे एक स्थानीय स्थानीय चर के पास एक वैध पता है जिसे आप किसी अन्य विधि में पारित कर सकते हैं। क्या आप उस टुकड़े पर विस्तार से बता सकते हैं –

1

तुम सिर्फ एक सूचक में पारित कर दिया है, तो सभी विधि पहले से ही विद्यमान NSError उद्देश्य यह है कि आप ओर इशारा करते हैं बदल जाएगा कर सकता है।

आप एक एनएसईआरआर ऑब्जेक्ट को बदल नहीं सकते हैं।

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

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