Я должен всегда выпускать сам, когда существует отказ внутри init, или я должен только сделать так, если я инициализировал переменные экземпляра сначала?
Другими словами, действительно ли этот шаблон допустим? Существует ли время, когда я не должен выпускать сам в init методе, или я должен предположить, что, если поток управления входит, 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
, то не имеет смысла посылать release на 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 Center по Handling Initialization Failure