См. Распределение и инициализация объектов в документации.
В частности, если у вас есть ошибка в инициализаторе, вы 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
указывает, что экземпляр исчез.Утечки нет, и все счастливы.
Это также допустимый шаблон (предположим, что 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
, чтобы сделать что-то странное.