使用协议时,指定初始化器应该只在 'super' 上调用指定初始化器?

Designated initializer should only invoke a designated initializer on 'super' When using protocols?

我有以下结构。 我得到了符合 protocol Aclass Bprotocol A 定义了一个指定的初始值设定项,它是-(instancetype)initWithInt:(int)count

但是,当我在 class B 中实现标准 -(instancetype)init 并使其使用也在 class B 中实现的指定初始化程序时,我收到了警告"Designated initializer should only invoke a designated initializer on 'super'",而我的指定初始化程序(IMO 是 initWithInt)从不调用 super 上的任何指定初始化程序。

@protocol A
{
(instancetype) init;
(instancetype) initWithInt:(NSUInteger)count;
}

@interface B : NSObject <A>

@implementation B
- (instancetype) init {
    return [self initWithInt:0];
}
- (instancetype) initWithInt:(NSUInteger)count {
    self = [super init];
    return self;
}

知道编译器为什么在这种特定情况下忽略此警告吗?

来自Working with Protocols

A class interface declares the methods and properties associated with that class. A protocol, by contrast, is used to declare methods and properties that are independent of any specific class.

每个 class 都有自己的(继承的)指定初始化程序。您不能在协议中声明指定的初始值设定项。如果你想在协议中声明一个初始化器,像这样实现它:

- (instancetype)initWithInt:(NSUInteger)count {
    self = [self initWithMyDesignatedInitializer];
    if (self) {
        // do something with count
    }
    return self;
}

或喜欢:

- (instancetype)initWithInt:(NSUInteger)count {
    return [self initWithMyDesignatedInitializer:count];
}

并且不要在您的协议中声明 init,它由 NSObject 声明。

编辑:

在协议中声明初始化程序没有意义。当你分配和初始化对象时,你知道对象的 class 并且应该调用这个 class.

的指定初始化程序

编辑 2:

指定初始化程序特定于 class 并在此 class 中声明。您可以初始化 class 的实例,但不能初始化协议的实例。协议使得在不知道对象的 class 的情况下与对象对话成为可能。关于初始值设定项的文档:Multiple Initializers and the Designated Initializer.