Я только что читал о том, как правильно сбой в методе init, и документы, похоже, не согласны друг с другом. Рекомендуется рекомендовать исключение, в то время как другие рекомендуют очищать и возвращать нуль. Какая здесь самая лучшая практика?
[self release], [self dealloc] или [super dealloc] в методах init?
Ответ 1
Я считаю, что общепринятая практика заключается в том, чтобы вернуть нуль при неудаче. Но вы хотите освободить себя, чтобы избежать утечки:
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
Ответ 2
Были рассмотрены правильные решения (исключения и/или [self release]; return nil;
), я рассмотрю неправильные решения.
Не отправляйте dealloc
напрямую. Это release
задание. (И если ваш код работает под GC, dealloc
неприменим, и я мог только размышлять над тем, какие вызовы вызовут его вызовы.)
Дважды не используйте super
, чтобы отправить его напрямую. Это пропустит вашу собственную реализацию dealloc
.
Ответ 3
Cocoa Философия исключений заключается в том, что их нужно бросать только в ситуациях, которые являются ошибками программиста, например, передавая незаконный аргумент методу. Если что-то пошло не так, метод должен просто вернуть NO или nil и, надеюсь, сообщить подробности через параметр NSError ** "out".
Это включает в себя методы -init. Если ситуация с ошибкой - это то, что может быть законно достигнуто в готовом продукте, тогда метод должен освободить себя (чтобы избежать утечки) и вернуть нуль.
Ответ 4
Метод, который я всегда использовал, - это очистка и возврат нулевого значения. Три метода, которые вы указываете в заголовке вопроса, могут привести к повышению segfaults в иерархии вызовов, тогда как возврат nil не будет. Я считаю, что сами Apple заявляют, что возвращаются к неудаче. Где вы находите расхождения?