2009-08-11 19 views
3

他の変数の値に応じて特定の値に初期化されるNSStringのインスタンスを作成したいとします。通常、私はしかし、私が見てきたいくつかのサンプルコードでは、私は人々がこれら二つの違いがあり、そしてどの方法が好ましい何Cocoaでオブジェクトを宣言するとき、それらをnilに設定する必要がありますか?

NSString *string = nil; 
if(foo == 1) 
    string = @"Foo is one."; 
else 
    string = @"Foo is not one."; 

を行う

NSString *string; 
if(foo == 1) 
    string = @"Foo is one."; 
else 
    string = @"Foo is not one."; 

を見てきたんだろう?

答えて

6

私の個人的な好みは、任意の変数を直ちに初期化することです。ただし、提供したサンプルでは、​​これらの2つの方法は同等です。 C言語で

(すなわちCC++Obj-C)ランダムガベージ値を含んでいてもよい、すぐに初期化されていない変数。変数が初期化される前に変数を使用すると、予期せぬ動作(予期せぬクラッシュから予期しない動作に至るまで)につながります。

は、次の例を考えてみましょう:

int abs; 
if (argument > 0) abs = argument; 
else if (argument < 0) abs = -1 * argument; 
NSLog(@"%i", abs); 

ここでは、コードabs変数初期化されていないの葉argumentが0であれば、あなたがランダムな値を取得しますログに記録し、その後の残りの部分で値を破損につながりますプログラム;どこに問題があるのか​​を検出するのは難しいでしょう!

初期化されていない参照を使用すると、おそらくEXC_BAD_ACCESSになります。

1

変数を値またはnilに設定すると、初期化されていない値のエラーが実行時に見つけやすくなります。

NSString *string = @"Foo is not one"; 
if(foo == 1) 
    string = @"Foo is one."; 

最近、初期化されていない値の検出には、さまざまなコンパイラが適しています。

1つの目的Cの理由は、最後の使用後のポインタをガベージコレクションに設定する理由です。

0

一般に、変数の値が既知であることを確認するために、変数をnilに設定するのが一般的です。だからあなたは、変数がnilで始まることを知っていますし、後で変数をnilと比較することができます。この良い例では、変数を作成し、後であなたがゴミやクラッシュを取得するには、その変数を読み込むしようとすると、その後、初期化されていない状態から始めるとすることが可能ですので、

NSError *error = nil; 
[SomeCocoaClass performOperationWithObject:obj error:&error]; 
if(nil != error){ 
//handle error 
} 

ようNSErrorとエラーチェックです。変数を既知の初期状態に初期化し、後でその状態をチェックするのは、良いコーディング方法です。

2

nilへの代入は、誰もコードを見ず、変数が未定義の状態にあることを心配することがないようにそこにあります。文字列の値は不定ですので、

NSString *string; 
NSLog(@"%p", string); 

このコードは、ガベージ値を出力します。

例のようにコードを書くのではなく、ternary演算子を使用することをお勧めします。ここに例があります:

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one."; 

現在、文字列の値は常に定義されています。式が複雑になり、行が長くなる場合は、中間変数を使用してください。

多くの問題に対する最良の解決策は、問題を排除することです。これだけです。

関連する問題