Уил Шипли рекомендует это (от 2009 г.):
- (id)init;
{
if (!(self = [super init]))
return nil;
// other stuff
return self;
}
Но зачем назначать возврат super init самому себе?
статья Мэтта Галлахера пытается объясни это...
-- Цитировать:
Если вы помните, в начале я сказал, что initWithString: часть типичного вызова [[MyClass alloc] initWithString:@"someString"] преобразуется в вызов objc_msgSend:
MyClass *myObject2 = objc_msgSend(myObject1, initSelector, @"someString");
Итак, к тому времени, как мы доберемся до внутренней части метода, self уже имеет значение; его значение равно myObject1 (т. е. выделенный объект, возвращенный вызовом [MyClass alloc]. Это важно, поскольку без него супервызов был бы невозможен — значение self используется компилятор для отправки вызова:
[super init];
становится:
objc_msgSendSuper(self, @selector(init));
Да, self уже имеет значение при запуске вашего инициализатора. На самом деле почти гарантировано правильное окончательное значение.
-- Убрать из кавычек
По сути, я думаю, что многие люди остаются в замешательстве относительно того, на что именно указывает «я» каждого метода инициализации, вверх по цепочке суперклассов.
Ответ на эту загадку подразумевается в документ по языку программирования Objective-C в разделе "Назначенные инициализаторы":
Обратите внимание, что версия B init отправляет сообщение самому себе, чтобы вызвать метод initWithName:. Поэтому, когда получатель является экземпляром класса B, он вызывает версию initWithName: B, а когда получатель является экземпляром класса C, он вызывает версию C.
Или, другими словами, переменная self указывает на наш экземпляр, который инициализируется. Еще раз подчеркнем, что все эти методы инициализации вверх по цепочке суперклассов наследуются нашим экземпляром, и поэтому переменная 'self' в них указывает на наш экземпляр (если не изменена явно).
Я прав? Конечно!
person
Todd Hopkinson
schedule
19.05.2011