2012-03-23 17 views
1

私はPaul HegartyのスタンフォードCS193Pから勉強しています。それで、私はこのようなものを見て、他の人が使っているのを見ます:はif(self){[self initFOO]} redundant?

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

冗長ではありませんか?なぜ使用しないだけでいいですか:

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

私はメッセージがなくなるのを防ぐため、この2番目のフォーマットは使用しないでください。

答えて

5

自分にメッセージを渡す以外のことをしたい場合があります。たとえば:いくつかの初期化子は、それが初期化子で必要とされる条件を満足するオブジェクトを作成することは不可能だ場合nilを含め、さまざまなオブジェクトを返しますので、

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // set up ivars 
     _anIvar = 5; 
    } 
    return self; 
} 
4

[self someSetupFunctions]の意味は、単一のメソッド呼び出しだけでなく、いくつかの初期化コードです。selfがnilの場合、多くの重要なことが失敗します。特に、初期値をインスタンス変数に代入しようとするとクラッシュします。

0

self = [super init]; if (self)テストがあります。

nilのインスタンス変数にアクセスしようとすると、間違ったことを間違いなく実行しているので、スーパークラスを防御する必要があります。 )。