私は次のような構造をしています。にclass B
準拠するものを入手しましたprotocol A
。protocol A
指定された初期化子を定義します-(instancetype)initWithInt:(int)count
。
ただし、標準-(instancetype)init
をclass B
実装して、クラスBにも実装されている指定の初期化子を使用するようにすると、「指定の初期化子は「スーパー」で指定の初期化子のみを呼び出す必要があります」という警告が表示されますが、指定の初期化子は(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;
}
この特定のケースでコンパイラがこの警告を省略している理由はありますか?
プロトコルの操作から:
クラスインターフェイスは、そのクラスに関連付けられたメソッドとプロパティを宣言します。対照的に、プロトコルは、特定のクラスから独立しているメソッドとプロパティを宣言するために使用されます。
各クラスには、独自の(継承された)指定された初期化子があります。プロトコルで指定された初期化子を宣言することはできません。プロトコルで初期化子を宣言する場合は、次のように実装します。
- (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:
指定された初期化子はクラスに固有であり、このクラスで宣言されます。クラスのインスタンスを初期化することはできますが、プロトコルのインスタンスを初期化することはできません。プロトコルを使用すると、このオブジェクトのクラスを知らなくても、オブジェクトと通信できます。初期化子に関するドキュメント:複数の初期化子と指定された初期化子。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加