2010-03-18 12 views
11

क्या मुझे हमेशा इंटिट के अंदर विफलता होने पर स्वयं को छोड़ना चाहिए, या क्या मुझे ऐसा करना चाहिए यदि मैंने पहले इंस्टेंस वैरिएबल शुरू किया है?क्या मुझे हमेशा असफल इनिट विधियों के लिए स्वयं को जारी करना चाहिए?

इसे एक और तरीका रखने के लिए, क्या यह पैटर्न मान्य है? क्या ऐसा समय है जब मुझे एक इनिट विधि के अंदर स्वयं को रिहा नहीं करना चाहिए, या मुझे लगता है कि अगर नियंत्रण प्रवाह init में प्रवेश करता है, तो आत्म कम से कम 1 की गिनती है?

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

//do some init stuff 
if (somethingFailed) 
{ 
    [self release]; 
    return nil; 
} 
return self; 
} 

उत्तर

17

तो कुछ की जांच की जरूरत में अपने प्रारंभ पद्धति असफल हो जाती है, तो हाँ आप self जारी करना चाहिए। नोट हालांकि, अगर [super init]nil देता है तो self पर selfnil पर रिलीज भेजने का अर्थ नहीं है। यह वास्तव में ऐप्पल द्वारा फेंक दिया गया है:

आपको विफलता के बिंदु पर केवल [self release] पर कॉल करना चाहिए। यदि आपको सुपरक्लास के प्रारंभकर्ता के आमंत्रण से nil वापस मिलते हैं, तो आपको release पर भी कॉल नहीं करना चाहिए।

उदाहरण:

- (id)init 
{ 
    self = [super init]; 
    if(self) { 
     // do some init stuff 

     if (somethingFailed) 
     { 
      [self release] 
      self = nil; 
     } 
    } 

    return self; 
} 

इसके अलावा पर Handling Initialization Failure

+0

आह मैक देव केंद्र दस्तावेज़ देखें, अब है कि आप इसे का कहना है तो स्पष्ट लगता। मैं थोड़ा फेंक दिया गया था क्योंकि मैं किसी ऑब्जेक्ट पर रिलीज का आह्वान कर रहा हूं कि मैंने आवंटन/कॉपी/नया इत्यादि नहीं लगाया था। – leo

+1

हाँ, मूलभूत सिद्धांत यह है कि जो भी पहले प्रारंभ में एक त्रुटि का सामना करता है उसे आवंटित स्थान आवंटित किया जाना चाहिए, और फिर शून्य वापस आना चाहिए। चूंकि हर कोई शून्य हो जाता है, इसलिए उनके पास स्मृति को रिहा करने का कोई तरीका नहीं है, इसलिए स्मृति स्मृति रिसाव से बचने के लिए आपको स्वयं को रिहा क्यों करना चाहिए। –

+0

समझ में आता है, धन्यवाद। – leo

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

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