2009-05-25 16 views
12

मैं अभी पढ़ रहा हूं कि एक इनिट विधि में ठीक से कैसे विफल होना है और दस्तावेज़ एक-दूसरे से असहमत प्रतीत होते हैं। एक अपवाद फेंकने की सिफारिश करता है जबकि अन्य सफाई और शून्य लौटने की सलाह देते हैं। यहां वर्तमान सर्वोत्तम अभ्यास क्या है?[स्वयं रिलीज], [स्वयं dealloc] या [सुपर dealloc] init तरीकों में?

उत्तर

16

मेरा मानना ​​है कि आमतौर पर स्वीकार्य अभ्यास विफलता पर शून्य वापस करना है। लेकिन आप स्वयं को रिहा करने का एक रिसाव से बचने के लिए चाहते हैं: अपवाद पर

-(id)init 
{ 
    if (self = [super init]) { 
    ... 
    if (thingsWentWrong) { 
     [self release]; 
     return nil; 
    } 
    ... 
    } 
    return self; 
} 
+0

फीडबैक दोस्तों के लिए धन्यवाद। यही वह है जो मैं कर रहा था और उचित दृष्टिकोण माना जाता था लेकिन दस्तावेज़ों में अन्य दो तरीकों के संदर्भ में मुझे लगता था कि कुछ खास मामलों के बारे में पता होना चाहिए। – Kevin

0

जिस विधि का मैंने हमेशा उपयोग किया है वह सफाई और शून्य लौट रहा है। आपके प्रश्न शीर्षक में जिन तीन विधियों का उल्लेख है, वे कॉल पदानुक्रम में सेगफाल्ट अधिक हो सकते हैं, जबकि शून्य वापस नहीं आएगा। मेरा मानना ​​है कि ऐप्पल दस्तावेज़ स्वयं विफलता पर वापस लौटने के लिए कहते हैं। आप विसंगतियों को कहां ढूंढ रहे हैं?

+2

बस वापस लौटने से स्मृति रिसाव हो जाएगी, क्योंकि आवंटन के लिए कॉल एक वस्तु को बनाए रखने के साथ एक वस्तु बनायेगा। –

+0

स्मृति रिसाव वह है जिसे मैं टालना चाहता हूं। डॉक्स – Kevin

+0

लिंक: त्रुटि जांच प्रारंभ के दौरान - http://tr.im/mlyA एक प्रारंभकर्ता को लागू - http://tr.im/mlyX आप देखेंगे कि दूसरी कड़ी में नमूना कोड के तहत वे इसके बजाय एक अपवाद फेंकने की सलाह देते हैं। मुझे पूरा यकीन है कि वर्तमान सर्वोत्तम अभ्यास नहीं है। – Kevin

6

कोको के दर्शन है कि वे केवल, स्थितियों कि प्रोग्रामर त्रुटियाँ हैं में फेंक दिया जाना चाहिए एक तरीका है करने के लिए एक अवैध तर्क गुजर की तरह है। अगर कुछ और गलत हो जाता है, तो विधि को सिर्फ शून्य या शून्य वापस नहीं करना चाहिए, और उम्मीद है कि एनएसईआरआर ** ** "आउट" पैरामीटर के माध्यम से विवरण की रिपोर्ट करें।

इसमें -init विधियां शामिल हैं। यदि त्रुटि स्थिति कुछ ऐसा है जो वैध उत्पाद में वैध रूप से हो सकती है, तो विधि को स्वयं को छोड़ना चाहिए (रिसाव से बचने के लिए) और शून्य वापस आना चाहिए।

9

सही समाधान (अपवाद और/या [self release]; return nil;) कवर किए गए हैं, मैं गलत समाधानों को संबोधित करूंगा।

सीधे dealloc न भेजें। यह release का काम है। (और यदि आपका कोड कभी भी जीसी के तहत चल रहा है, dealloc लागू नहीं है, और मैं केवल यह कह सकता हूं कि इससे कौन सी समस्याएं कॉल होंगी।)

इसे सीधे भेजने के लिए super का उपयोग न करें। इससे आपके dealloc कार्यान्वयन पर छोड़ दिया जाएगा।

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