我有以下结构。
我得到class B
,符合protocol A
。
protocol 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;
}
知道为什么编译器会在这种特定情况下省略此警告吗?
答案 0 :(得分:1)
类接口声明与该类关联的方法和属性。相反,协议用于声明独立于任何特定类的方法和属性。
每个类都有自己的(继承的)指定初始化程序。您无法在协议中声明指定的初始值设定项。如果要在协议中声明初始化程序,请按以下方式实现:
- (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。