هل يجب أن أفرج عن النفس دائمًا لطرق init الفاشلة؟
-
20-09-2019 - |
سؤال
هل يجب أن أفرج عن النفس دائمًا عندما يكون هناك فشل في الداخل ، أو هل يجب أن أفعل ذلك فقط إذا قمت بتهيئة متغيرات المثيل أولاً؟
بعبارة أخرى ، هل هذا النمط صالح؟ هل هناك وقت لا ينبغي أن أحرّر فيه ذاتيًا داخل طريقة 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 على التعامل مع فشل التهيئة
لا تنتمي إلى StackOverflow