2

パラメータを使用して を作成する必要がある状況にありinitます。

- (id) initWithSomeParameter:(id)parameter;

通常initは呼び出されません。したがって、これを達成するには 2 つの選択肢があります。initまたは returnを呼び出すと、実際に例外をスローできますnil

どちらを行う必要がありますか?なぜですか?

4

2 に答える 2

4

あなたのユースケースについてもっと知らずに言うのは難しいです。ただし、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!"];
  }
}
于 2013-02-26T01:53:35.590 に答える
4

他のすべてのメソッドが呼び出す指定された初期化子が必要です。init

あなたの例では、指定された初期化子はおそらく

- (id)initWithSomeParameter:(id)something;

指定されたイニシャライザの代わりに別のプログラマが呼び出した場合-(id)init、次のようにすることができます。

- (id)init
{
    return [self initWithSomeParameter:nil];
}

に絶対に値を提供する必要someParameterがある場合は、必要に応じて例外を発生させることができますが、この方法は、インスタンス オブジェクトの初期化時に値を取得することがどれほど重要であるかによって異なります。

指定された初期化子の使用に関するAppleの入力も次のとおりです。

http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MultipleInitializers.html

于 2013-02-26T01:46:38.250 に答える