Ответ 1
См. Размещение и инициализация объектов в документации.
В частности, если у вас есть ошибка в инициализаторе, вы release
self
и возвращаете nil
:
- init
{
self = [super init];
if (self) {
if (... failed to initialize something in self ...) {
[self release];
return nil;
}
}
return self;
}
Теперь рассмотрим, что происходит, когда вы вызываете [super init]
и возвращает nil
. Вышеупомянутый шаблон уже используется, то, что было self
, было выпущено, а nil
return указывает, что экземпляр отсутствует. Нет утечки, и все счастливы.
Это также допустимый шаблон (предположим, что self
является экземпляром MyClass
):
- init
{
self = [super init];
if (self) {
... normal initialization here ...
} else {
self = [MyClass genericInstanceWhenInitializationGoesBad];
self = [self retain];
}
return self;
}
Так как ожидается, что init
возвращает что-то, что является retained
(подразумевая привязку из +alloc
), тогда [self retain]
, хотя он выглядит тупой, на самом деле правильный. self = [self retain]
просто является дополнительной защитой, если MyClass
переопределяет retain
, чтобы сделать что-то странное.