Objective c 指定的初始值设定项只能在';超级';什么时候使用协议?

Objective c 指定的初始值设定项只能在';超级';什么时候使用协议?,objective-c,xcode,objective-c-runtime,Objective C,Xcode,Objective C Runtime,我有以下结构。 我得到了符合A方案的B级等级。 协议A定义了一个指定的初始值设定项,它是-(instancetype)initWithInt:(int)count 然而,当我在类B中实现标准-(instancetype)init,并使用同样在类B中实现的指定初始值设定项时,我得到警告“指定初始值设定项应仅在“super”上调用指定初始值设定项,而我的指定初始值设定项(IMO是initWithInt)从不调用super上的任何指定初始值设定项 @protocol A { (instancetype

我有以下结构。 我得到了符合A方案的B级
等级
协议A
定义了一个指定的初始值设定项,它是
-(instancetype)initWithInt:(int)count

然而,当我在
类B
中实现标准
-(instancetype)init
,并使用同样在类B中实现的指定初始值设定项时,我得到警告“指定初始值设定项应仅在“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;
}
@协议A
{
(instancetype)初始化;
(instancetype)initWithInt:(nsInteger)计数;
}
@接口B:NSObject
@实施B
-(instancetype)初始化{
返回[self initWithInt:0];
}
-(instancetype)initWithInt:(nsInteger)计数{
self=[super init];
回归自我;
}
知道编译器在这种特定情况下为什么忽略此警告吗?

来自:

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

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

- (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:


指定的初始值设定项是特定于类并在此类中声明的。您可以初始化类的实例,但不能初始化协议的实例。协议使您可以在不知道该对象的类的情况下与对象对话。有关初始值设定项的文档:。

问题是什么?@matt刚刚更新了qu估计部分。你打算如何使用这个协议?你不能在协议中的方法中实现方法,我不确定你在这里说的是什么。此外,理性地说,在协议中定义指定初始值设定项有什么不对,你反对它的论点没有提供足够的理由。我想你不明白协议是什么。阅读。我同意协议独立于类。但是,不允许协议声明指定的初始值设定项(如initWithInt:)的原因是什么,因此只有实现此初始值设定项的类才能成功地符合协议?这是缺少的部分,仍然没有得到回答。指定的初始值设定项初始值设定项调用其超类的指定初始值设定项。其他初始值设定项调用self的初始值设定项。如果我的类具有指定的初始值设定项
initWithString:
,我将如何实现
initWithInt:
?它缺少我的字符串参数。如何分配匿名对象并调用
initWithInt:
?B因为苹果是这么说的。我的答案没有用,我会删除它。