パラメータを使用して を作成する必要がある状況にありinit
ます。
- (id) initWithSomeParameter:(id)parameter;
通常init
は呼び出されません。したがって、これを達成するには 2 つの選択肢があります。init
または returnを呼び出すと、実際に例外をスローできますnil
。
どちらを行う必要がありますか?なぜですか?
パラメータを使用して を作成する必要がある状況にありinit
ます。
- (id) initWithSomeParameter:(id)parameter;
通常init
は呼び出されません。したがって、これを達成するには 2 つの選択肢があります。init
または returnを呼び出すと、実際に例外をスローできますnil
。
どちらを行う必要がありますか?なぜですか?
あなたのユースケースについてもっと知らずに言うのは難しいです。ただし、APIが厳しすぎる可能性があります。
UIKit
それ自体は、動作するためにいくつかのデータを必要とするクラスでいっぱいですが、initでは必要ありません。例にとってみましょうUIImageView
。「画像ビューには何かを行うには画像が必要なので、initに画像が必要です!」と思うかもしれません。ただし、ここでのこのスニペットは完全に有効なユースケースです。
UIImageView *foo = [[UINavigationController alloc] init];
foo.image = [UIImage imageNamed:@"bar"];
ここでは、画像ビューを作成し、2番目のステップで画像自体を割り当てます。したがって、データが存在しない場合にデータが存在する必要がある方法でオブジェクトを使用しようとすると、代わりに例外がスローされます。
また、指定された初期化子は通常、最も多くの引数を取るものであり、残りはそれを呼び出します。このようなものはあなたが望むものかもしれません。
- (id)init {
// call this class's designated initializer
return [self initWithSomething:nil];
}
// this class's designated initializer
- (id)initWithSomething:(NSString*)something {
self = [super init]; // call superclass's designated initializer
if (self) {
// this class's setup code goes here, saving any arguments
somethingInstanceVar = something;
}
return self;
}
// some other method.
- (NSString*)doSomething {
if (somethingInstanceVar) {
// all is well, do stuff
return somethingInstanceVar;
} else {
// never got a "something" raise an exception
[NSException raise:@"Missing data" format:@"Something is required!"];
}
}
他のすべてのメソッドが呼び出す指定された初期化子が必要です。init
あなたの例では、指定された初期化子はおそらく
- (id)initWithSomeParameter:(id)something;
指定されたイニシャライザの代わりに別のプログラマが呼び出した場合-(id)init
、次のようにすることができます。
- (id)init
{
return [self initWithSomeParameter:nil];
}
に絶対に値を提供する必要someParameter
がある場合は、必要に応じて例外を発生させることができますが、この方法は、インスタンス オブジェクトの初期化時に値を取得することがどれほど重要であるかによって異なります。
指定された初期化子の使用に関するAppleの入力も次のとおりです。