Это правда, что init может вернуть nil
, если инициализация не удалась. Но это не основная причина, по которой вы должны присваивать себе значение при реализации собственных инициализаторов.
Это было упомянуто ранее, но необходимо подчеркнуть еще больше: экземпляр, возвращенный из инициализатора, может не совпадать с экземпляром, который вы отправили, на самом деле он может даже не относиться к тому же классу!
Некоторые классы используют это как стандарт, например, все инициализаторы для NSString
и NSArray
всегда будут возвращать новый экземпляр другого класса. Инициализаторы к UIColor
часто возвращают другой экземпляр специализированного класса.
И вы сами можете реализовать что-то подобное, если хотите:
-(id)initWithName:(NSString*)name;
{
if ([name isEqualToString:@"Elvis"]) {
[self release];
self = [[TheKing alloc] init];
} else if (self = [super init]){
self.name = name;
}
return self;
}
Это позволяет разбить реализацию некоторого особого случая на отдельный класс, не требуя, чтобы клиенты вашего API заботились о нем или даже не знали об этом.