指定的初始化程序应该只在'超级'上调用指定的初始化程序时使用协议?

时间:2017-09-22 21:04:52

标签: objective-c xcode objective-c-runtime

我有以下结构。 我得到class B,符合protocol Aprotocol A定义了指定的初始值设定项-(instancetype)initWithInt:(int)count

但是,当我在-(instancetype)init中使用标准class B并使其使用指定的初始化程序(也在B类中实现)时,我收到警告“指定的初始化程序应该只调用'super'上的指定初始值设定项,而我指定的初始化程序(IMO为initWithInt)从不在超级上调用任何指定的初始化程序。

@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;
}

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

1 个答案:

答案 0 :(得分:1)

来自Working with Protocols

  

类接口声明与该类关联的方法和属性。相反,协议用于声明独立于任何特定类的方法和属性。

每个类都有自己的(继承的)指定初始化程序。您无法在协议中声明指定的初始值设定项。如果要在协议中声明初始化程序,请按以下方式实现:

- (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声明。

编辑:

在协议中声明初始化程序是没有意义的。分配和初始化对象时,您知道对象的类,并应调用此类的指定初始值设定项。

编辑2:

指定的初始值设定项特定于类并在此类中声明。您可以初始化类的实例,但无法初始化协议实例。协议使得可以在不知道该对象的类的情况下与对象通信。有关初始值设定项的文档:Multiple Initializers and the Designated Initializer