Я просто хочу знать, под капотом, как он это делает.
Это довольно просто.99,9% всех классов, которые вы когда-либо напишите, будут наследовать от NSObject
в некотором роде.В инициализаторах вы должны вызывать инициализатор super
и назначать его self
.В конце концов, [super init]
будет вызывать -[NSObject init]
. Согласно документации , это реализовано так:
- (id)init {
return self;
}
Так что технически , если вы наследуете непосредственно от NSObject
, вы, вероятно, можете невыполните присвоение self = [super init];
, потому что вы знаете (и вам это гарантировано), что это эквивалентно: self = self;
, что бессмысленно.В любом случае, вы должны оставить это в целях согласованности.
Однако, как только вы начнете продвигаться дальше по цепочке наследования, и особенно , когда вы наследуете от непрозрачных классов (то есть классачей .m файл у вас нет), то все становится неясным.Возможно, вы столкнетесь с классом, чей назначенный инициализатор выглядит примерно так:
- (id) initWithFoo:(id)aFoo {
if ([aFoo isSuperFast]) {
[self release];
return [[SuperFastFooWrapper alloc] initWithFoo:aFoo];
}
self = [super init];
if (self) {
_foo = [aFoo retain];
}
}
Это не так часто, но это случается.В этом случае мы уничтожаем self
([self release]
, чтобы сбалансировать вызов alloc
, который непосредственно предшествовал этому), и вместо этого возвращаем другой объект.