コードが間違っているので、修正も間違っています。あなたがする必要があるのは言うことです
if (result == nil) {
// an error occurred, and the NSError* variable can now be consulted
}
result
が 以外の場合、 の内容について何もnil
推測することはできません。e
ここでの基本的な理由は、NSError**
戻り値を持つ API は、API がエラーを返さない限り、その場所に何かを配置する必要がないからです。通常、これは、エラーでない場合、値をまったく変更しないことを意味します。そのため、e
以前に変数にあったものは何でも、その後にあるものになります。コードが ARC なしでコンパイルされている場合、e
変数にはスタックからのガベージが含まれます。ARC の下では に初期化されますがnil
、後で説明する理由から、ARC の下にはいないと思います。
ただし、これよりも複雑です。メソッドがエラーを返さなくても、NSError**
値が変更されている可能性があります。簡単な例は、このメソッドが別のメソッドを呼び出し、NSError**
そのメソッドに同じメソッドを渡し、エラーから回復して代わりに成功値を返す場合です。しかし、2 番目の方法NSError*
では、有効でなくなったエラーが変数に入力されている可能性があります。
さて、あなたのコードが ARC ではないと私が考える理由は、私の知る限りでは、最近のすべての Cocoa API は、エラーが発生しない限り値を変更しないように苦労しているからです。NSError**
これは、1 年か 2 年前に確立された新しいガイドライン (2011 年か 2012 年の初めのどちらかでしたが、どちらかは忘れました) に沿ったものであり、NSError**
パラメーターを持つメソッドはエラーの場合にのみパラメーターを変更する必要があります。これはNSError *e = nil; [foo callAPIWithError:e]; if (e) ...
、実際には API のルールに従っていない場合でも、NSError
正しくないコードに直面した場合の回復力を高めるための実用的な問題として、コードが機能することを許可することを目的としています。また、ARC はオブジェクト型のすべての自動変数をゼロにするため、クラッシュはそれe
がゼロにされていないことを示しているため、ARC にいません。
ただし、上記の段落で述べたことにかかわらず、エラーがスローされない場合でも、有効なNSError
API が値をそのままにしておくと想定しないでください。NSError
このような API を実装するための現在のガイドラインでは、それが正しいとされていますが、それは厳密な要件ではありません。これらのガイドラインの前に書かれたコードはそのように動作しない可能性があり、ガイドラインの後に書かれたコードはそれらを無視する可能性があります. 有効な APIを呼び出すための規則では、NSError
引き続き API の戻り値を参照する必要がありNSError*
、戻り値がエラーの発生を示している場合にのみ変数を確認することができます。