42

Objective-Cでは、カスタム初期化ロジックを追加するために、サブクラスの継承されたすべてのコンストラクターをオーバーライドする必要がありますか?

たとえば、UIViewカスタム初期化ロジックを持つサブクラスの場合、次は正しいでしょうか?

@implementation CustomUIView

- (id)init {
    self = [super init];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (id)initWithFrame:(CGRect)theFrame {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:decoder];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (void) initHelper {
    // Custom initialization
}

@end
4

3 に答える 3

46

すべてのCocoaTouch(およびCocoa)クラスには、指定された初期化子があります。の場合、このドキュメントUIViewに記載されているように、そのメソッドはです。この特定のケースでは、オーバーライドする必要があるのは;だけです。他のすべての呼び出しはカスケードダウンし、最終的にこのメソッドにヒットします。initWithFrame:initWithFrame

これは質問の範囲を超えていますが、追加のパラメーターを使用してカスタム初期化子を作成することになった場合は、次selfのように割り当てるときに、スーパークラスの指定された初期化子を確認する必要があります。

- (id)initWithFrame:(CGRect)theFrame puzzle:(Puzzle *)thePuzzle title:(NSString *)theTitle {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self setPuzzle:thePuzzle];
        [self setTitle:theTitle];
        [self initHelper];
    }
    return self;
}
于 2010-12-05T16:35:14.187 に答える
5

Interface Builderを使用する場合、次のように呼ばれます。

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
       //do sth
    }
    return self;
}
于 2016-11-09T10:00:24.707 に答える
4

一般に、指定された初期化規則に従う必要があります。指定された初期化子はinitであり、すべてのインスタンス変数の初期化をカバーします。指定された初期化子は、クラスの他のinitメソッドによって呼び出されるメソッドでもあります。

指定された初期化子に関するAppleのドキュメント。

initWithFrame:NSViewクラスの指定された初期化子です。AppleのCocoaドキュメントには、クラスの指定された初期化子が常に明示的に記載されています。

initWithCoder:ここでSOについて説明します。

于 2010-12-05T16:50:50.967 に答える