هل يجب أن أفرج عن النفس دائمًا لطرق init الفاشلة؟

StackOverflow https://stackoverflow.com/questions/2467685

سؤال

هل يجب أن أفرج عن النفس دائمًا عندما يكون هناك فشل في الداخل ، أو هل يجب أن أفعل ذلك فقط إذا قمت بتهيئة متغيرات المثيل أولاً؟

بعبارة أخرى ، هل هذا النمط صالح؟ هل هناك وقت لا ينبغي أن أحرّر فيه ذاتيًا داخل طريقة 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;
}
هل كانت مفيدة؟

المحلول

إذا فشل البعض الذي تحتاجه في طريقة التهيئة الخاصة بك ، فعندك يجب أن تصدر self. لاحظ أنه إذا [super init] عائدات nil ليس من المنطقي إرسال الإصدار إلى self مثل self هو nil. هذا هو في الواقع عبس من قبل Apple:

يجب عليك الاتصال فقط [self release] في نقطة الفشل. إذا حصلت nil مرة أخرى من احتجاج من تهيئة الفئة الفائقة ، يجب ألا تتصل أيضًا release.

مثال:

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

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

   return self;
}

انظر أيضًا وثائق مركز Mac Dev على التعامل مع فشل التهيئة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top