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
すべてのCocoa Touch(および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;
}
Interface Builderを使用する場合、その名前は次のとおりです。
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
//do sth
}
return self;
}