Подтвердить что ты не робот

InitWithCoder, [super init] или [super initWithCoder]?

Могу ли я спросить, какую версию я должен использовать, в моих старых приложениях я, кажется, использую "B", но когда я просматриваю множество примеров в Интернете, я вижу много версий, которые выглядят как "A".

// A
- (id)initWithCoder:(NSCoder *)decoder {
    self=[super initWithCoder:decoder];
    if(self) {
        ...

ИЛИ

// B
- (id)initWithCoder:(NSCoder *)decoder {
    self=[super init];
    if(self) {
        ...
4b9b3361

Ответ 1

Если суперкласс принимает NSCoding (что, вероятно, не всегда так), всегда вызывайте

[super initWithCoder:decoder]

В противном случае вызовите назначенный инициализатор.

Ответ 2

Зависит от соответствия суперкласса протоколу NSCoding или нет. Если это так, вы должны позвонить [super initWithCoder:decoder]. Если это не так, вы должны вызывать инициализатор назначенного суперкласса.

Например, если ваш класс является прямым подклассом NSObject, вы вызываете [super init], NSObject назначенный инициализатор, так как NSObject не соответствует протоколу NSCoding.