2015-03-13 3 views

ответ

1

Чтобы сделать его коротким:

A. Каждый класс имеет один (обычно) или более первичные (назначенные) Инициализаторы. Прежде чем выполнять свою инициализацию, вы должны выполнить один из основных инициализаторов супер. Например, в NSObject-init является основным инициализатором. Если у вас есть подкласс NSObject вы должны выполнить init (NSObject), прежде чем сделать свою собственную инициализацию:

@interface MyClass : NSObject 
… 
@end 

@implementation MyClass 
- (id)init // My primary initializer 
{ 
    // Before I do my own -init, if have to execute super's -init 
    self = [super init]; 
    … 
} 
@end 

Это справедливо, если ваш подкласс имеет новый первичный инициализатору:

@interface MyClass : NSObject 
… 
@end 

@implementation MyClass 
- (id)initMyClassWith… // My primary initializer, that's different from NSObject's 
{ 
    // Before I do my own -initMyClass, if have to execute super's -init 
    self = [super init]; 
    // As long, as -init is not overridden, self-init would work by acdident, 
    // but you have to override on a PI change, see below! 
    … 
} 
@end 

Вы делаете не отправить init в super (более общий: выполнить PI супер), когда у вас есть удобный инициализатор. В этом случае вы посылаете сообщение для себя:

@interface MyClass : NSObject 
… 
@end 

@implementation MyClass 
- (id)initConvenient // My secondary initializer 
{ 
    self = [self initMyClass]; // primary 
    … 
} 
@end 

Поэтому на изменения ПИ, вы должны переопределить PI супер, чтобы сделать его выполнить подкласс PI:

@interface MyClass : NSObject 
… 
@end 

@implementation MyClass 
- (id)init // subclass' secondary 
{ 
    self = [self initMyClass]; // Primary 
    … 
} 
@end 
+1

«primary» называется «обозначенным». – Sulthan

+0

Зависит от возраста документации: Ранее Apple использовала «обозначенные» и «вторичные». В наши дни Apple использует «назначенные» и «удобные». До этого я переключаюсь на «первичный» и «вторичный», чтобы последовательно именовать. Бьюсь об заклад, в следующей версии ОС снова появляются новые имена. ;-) –

+0

Добавил его, чтобы сделать его совместимым с документами Apple. Спасибо. –

0

Вы должны использовать super init, когда вы переопределяете инициализатор из своего суперкласса. Например, если вы являетесь подклассом UIViewController, вы вызываете [super init], а затем добавляете свой код инициализации.

+0

Чтобы быть более точным: Нет, во многих случаях вам не нужно отправлять сообщение «супер», иногда это ломает вещи. Но верно для '-init ...'. –

+0

На самом деле он спрашивает об инициализаторах. И там вам нужно вызвать super init. –

+0

Я изменил свой комментарий. Но это все еще не так, потому что вы выполняете init init только в основном инициализаторе. Если это вторичный инициализатор (удобный инициализатор), вы должны выполнить первичный инициализатор 'self'. –

1

Вы используете [super init] во всех подклассах, которые вы реализуете, которые также имеют метод -init, -initWith ....

Это означает, что код родительского класса выполняется до вашего.

Details explanations

Смежные вопросы