2009-10-29 18 views
7

कई कोको विधियां हैं जिन्हें किसी विधि के पैरामीटर के रूप में एनएसईआरआर ऑब्जेक्ट की आवश्यकता होती है, लेकिन वास्तव में त्रुटियों के मौजूद होने पर कॉलिंग विधि में त्रुटि ऑब्जेक्ट को वापस करने का माध्यम है। क्या यह लौटाई गई वस्तु बरकरार है? यही कारण है कि करता है वहाँ होने की जरूरत है बुला वस्तु कोड (विधि है जो करने के लिए त्रुटि दी है) में है, कुछ कोड की तरह:क्या मुझे एक लौटा हुआ एनएसईआरआर ऑब्जेक्ट जारी करने की आवश्यकता है?

NSError *error; 
    [apiCall .... error:&error]; 

    if (error){ 
    [*error release]; 
} 

मैं इस कहीं भी नहीं देखा है, और यह करने की आवश्यकता है, तो जारी किया, क्या यह करने का तरीका है?

उत्तर

7

रिटर्न किए गए ऑब्जेक्ट्स आमतौर पर ऑटोरेलेज्ड होते हैं। सामान्य नियम यह है कि आप केवल auto-/release पर कॉल करते हैं यदि आपने पहले उसी ऑब्जेक्ट पर copy/alloc/retain कहा था। और अगर आप नहीं होगा एक विधि कॉल में error भिन्नता:

// right 
[error code] 
// wrong 
[*error code] 
+0

कारण मैं [* त्रुटि कोड] डालता हूं यह है कि आप एनएसईआरआरआर var को भी निर्दिष्ट कर सकते हैं: NSError ** त्रुटि; जो वस्तु के बिंदु पर एक बिंदु है। क्या यह मान्य है? – casademora

+0

आप 'त्रुटि' के लिए एक प्रकार के रूप में 'NSError **' निर्दिष्ट करते हैं, जब यह "आउट पैरामीटर" या "आउटपुट पैरामीटर" होता है। उस स्थिति में आप अव्यवस्था करेंगे, लेकिन ध्यान दें कि '* त्रुटि' में 'NSError *' टाइप होगा। आप इस तथ्य को पाने के लिए पैरामीटर का उपयोग करते हैं कि कार्यों में केवल एक वापसी मूल्य होता है। Objc-C में आउट पैरामीटर 'टाइप **' का उपयोग करते हैं क्योंकि तर्क पास-दर-मान होते हैं। ध्यान दें कि अगर 'त्रुटि' में 'एनएसईआरआर ** ** टाइप किया गया था, तो आपको इसे' एनएसईआरआर * * (जो आप एपीआई कॉल में करते हैं) के लिए पॉइंटर के साथ शुरू करना होगा या एक पॉइंटर आवंटित करना होगा, जो होता है लेकिन थोड़ा अजीब है। – outis

+0

@outis अगर यह स्वत: समाप्त हो गया है, तो कॉलर विधि में इसका उपयोग गलत नहीं है। क्योंकि जिस विधि ने वास्तव में एनएसईआरआरआर * बनाया है और इसे आउट पैरामीटर में असाइन किया गया है, एनएसईआरर ** विधि कॉल के साथ समाप्त हो गया है और हम उसके बाद कॉलर में इसका उपयोग करते हैं। – SayeedHussain

4

आप त्रुटि के लिए स्मृति आवंटित नहीं किया है, तो आप इसे जारी करने की जरूरत नहीं है। एक नियम के रूप में, ढांचा आमतौर पर ऑटोरलीज को किसी भी ऑब्जेक्ट में जोड़ता है।

6

developer.apple.com पर मेमोरी नियम पढ़ें किसी भी व्यक्ति को उन्हें पहले से कॉपी/आवंटित/बनाए रखने की तरह कभी भी भरोसा न करें - यह नियम नहीं है, जो वास्तव में कुछ कहता है 'आपने वस्तु को प्राप्त किया नाम के हिस्से के रूप में प्रतिलिपि, नया या आवंटन विधि। दोबारा, मुझ पर भरोसा न करें, developer.apple.com

एनएसईआरआर * * के रूप में, यह गलत है। METHOD एक एनएसईआरआर * * को अपने तर्क के रूप में लेता है, जो एक एनएसईआरआर * के लिए सूचक है। एनएसईआरओआर के लिए यह पॉइंटर * जो से से आता है और आपको यह मानने का कोई अधिकार नहीं है कि एनएसईआरर के पते के साथ पॉप्युलेट किया जाएगा।

आप केवल एक एनएसईआरआरआर * के लिए एक सूचक पास कर सकते हैं * - कुछ भी गलत है।

न ही आपको लगता है कि एनएसईआरआरआर ऑटो-रिलीज़ है। यह एक सिंगलटन हो सकता है, यह किसी भी संख्या में वैकल्पिक हो सकता है। आपको केवल यह जानने की जरूरत है कि 'आपने इसे बनाए रखा नहीं है, आपको इसे रिलीज़ करने की आवश्यकता नहीं है'।

+0

स्वामित्व नीति (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership।एचटीएमएल # // apple_ref/doc/uid/20000043-SW1) प्रतिलिपि/आवंटन/नए स्वामित्व स्वामित्व वाले तरीकों (और स्पष्ट रूप से स्वामित्व घोषित करता है), जो निर्धारित करता है कि रिलीज़ संदेश कौन भेजता है। – outis

+0

तृतीय पक्षों को इस नीति का पालन करने की आवश्यकता नहीं है, लेकिन ऐप्पल की सिफारिश है कि इसे वापस करने से पहले एक निर्मित एनएसईआरआरआर को ऑटोरेलीज़ करना है (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError .html # // apple_ref/doc/uid/TP40001806-CH204-SW5) – outis

+0

इसलिए "आम तौर पर स्वतः" और "सामान्य नियम"। – outis

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