2012-02-25 3 views
5

は私が持っていたiOSアプリを開発しました。私はそれをアーカイブしTestFlightに送ってテスト用にデプロイすると、不明な信号のエラーがクラッシュログに記録され始めました。NSError * error; vs NSError * error = nil;代わりの</p> <pre><code>NSError *error; </code></pre> <p>:</p> <pre><code>NSError *error = nil; </code></pre> <p>は、それは私が接続されている間、デバイス上のシミュレータやデバッグにデバッグしている間にうまく働いた

どうしてですか?

答えて

7

これは、初期化されていないポインタがあるために発生します。運が良ければ、クラッシュすることはありませんが、そのようなポインターを使用するのはundefined behaviorです。

NSError *error; 

...そしてあなたはそれを最初の方法を使用してしようとすると、これは変数

NSError *error = nil; 

を宣言し、割り当てるさ:dasblinkenlightsに明確にする

+0

@ daSn0wie疑わしいときは、初期化されていない変数のアドレスを宣言した直後に記録してください。 'NSLog(@" error:%p "、error);' – bneely

3

が、これは変数を宣言して答えますそれを何かに設定せずにアクセスするには、指している値を「ガーベッジ」と呼びます。これは他のメモリスタックのポインタです。アクセスすると、ほとんど常にアプリケーションがクラッシュします。したがって、上記のように、または直後に変数に値を代入することが常にベストプラクティスです。

+1

エラーがなければ、通常はメソッドがエラーステータスを返して、 'NSError'変数にアクセスすべきではありません。エラーがなければ、APIはエラーvarの値を保証しません。 varがnilに設定されていて、エラーがあったという呼び出しによって変更されたからといって、それに頼ることはできません。だから、それをnilに設定することは害でも良いことでもありません。 – zaph

+0

彼は本当に彼が使用しているAPIに依存します。 – coneybeare

+1

Appleドキュメントの 'NSError':"一般的に、メソッドは、エラーオブジェクトの単純な存在ではなく、NOまたはnilを返すなど、エラー状態を通知する必要があります。返されたエラーコードに依存することは常に安全です。 'NSError'オブジェクトに頼ることは安全かもしれないし、安全でないかもしれません。それは選択肢です。 – zaph

関連する問題