2011-01-08 14 views
0

init selfには以下のような違いがありますか?初心者質問について

まず:

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

    } 
    return self; 
} 

第二:

- (id)init { 
    if (self = [super init]) { 

    } 
    return self; 
} 

私は自己を初期化するために、第2の方法を使用したいです。しかし、Xcodeで新しいクラスを作成すると、そのコードを自動的に生成します。私は第二の方法が私が知らないいくつかの状態でいくつかの誤りを作るのではないかと恐れています。

答えて

4

いいえ、それらは同じです。

第2の方法は、ちょうどあなたが遭遇するかもしれないもう一つの方法はこれですself

の最初の割り当てを逃している:

- (id)init { 
    if (!(self = [super init])) { 
     return nil; // Bail! 
    } 
    // Further initialisation 

    return self; 
} 

これはif文で例外条件を入れ、コードを保持します(Happy Path)が左マージンの近くで正常に実行されることを期待してください。

+0

ありがとうございました。 – AechoLiu

2

Cおよびほとんどの言語ではありませんが、これらの2つは同じです。

まず

 
a = b; 
if (a) {} 

セカンド

 
if (a = b) {} 

まず一つは、単に1行を使用しています。

はしかし、彼らは

 
if (a == b) {} 
+0

ありがとうございました。 – AechoLiu

1

彼らは同等だとあなたが安全にこれらのいずれかを使用することができますように同じではありません。一部の人々は、それが過負荷に少しですので

if (self = [super init]) 

を使用しない:それはは「self[super init]の戻り値を代入して、(ブール値)条件としてselfを評価する」という意味します。一見

、一方が等価関係演算子==あるとして代入演算子=を解釈し、そのコードを読み違えることができ、すなわち、はそうではありませんどの、「[super init]によって返された値にself比較」。

これは、Cを初めて使用するプログラマにとっては特に混乱を招く可能性があります。すべてのプログラミング言語で式に代入ができるわけではありません。つまり、代入は別々の命令にする必要があります。

+0

ありがとうございました。 – AechoLiu

0

両者は機能的には同等ですが、条件式が期待される割り当てを使用することは、通常は偶発的であるために悪いプログラミング方法として推奨されません。G:

if (myVar = 5) { 
    printf("The variable was 5\n"); 
} 

あなたが実際に書くためのもの:

if (myVar == 5) { 
    ... 

しかしObjective-Cの初期化コードは、それがよく知られてシーケンスですので、通常はこの例外で、多くのことを繰り返し、その利便性のために条件式内で課題を書くことを選択する人もいます。

関連する問題