35

以下のように、なぜ NSError の前に置くのです&errorerror?

例えば

NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

また、これは常に必要な方法ですか、それとも特定の状況でのみ必要ですか? ありがとう。

4

3 に答える 3

63

関数はアドレスを変更する必要があるため、アドレスを取得する必要がありますerrorはポインタerrorで渡されるため、「アドレスを取る」演算子が必要です。&

C および Objective-C は、パラメータを値で渡します。アンパサンドなしで渡し、呼び出したメソッドがそれを変更した場合、メソッドは のローカル コピーerror動作するため、呼び出しを行った関数は変更を認識しません。NSError*

**メソッドのシグネチャを見て、そこにある場合は、対応するパラメーターの前にアンパサンドが必要であることがわかります。

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error
                                            //   ^ one                    ^^ two
于 2012-04-07T23:24:03.753 に答える
8

errorパラメータの型は です。これ(NSError **)は、NSError へのポインタへのポインタです。引数として使用するerror変数はおそらく として宣言されているNSError *ため、型を適切に一致させるには、演算子のアドレスを使用してポインターへのポインターを取得する必要があります ( &error)。そもそもメソッドがポインターへのポインターを必要とする理由は、メソッドの値を変更し、errorその新しい値をメソッドの呼び出し元が使用できるようにするためです。

于 2012-04-07T23:26:54.697 に答える
7

基本的に、問題の根本は、2 番目の (オプションの) オブジェクトを返したいというハックです。

返せるものは 1 つだけなので、これを行うにはどうすればよいでしょうか。ある種の(return_value, error)タプルを返すこともできますが、それは少し扱いに​​くいです。パラメータはいくつでも設定できますが、それらを使って何かできるでしょうか...

したがって、メソッド/関数はそれらのパラメーターを変更できません (正確には、それらはコピーで動作するため、それらが行う変更はローカルです)。つまり、(並行性の問題は別として)質問のメッセージの前の値は、その後fetchRequestの値と等しくなります。fetchRequestが指すオブジェクトは変更される可能性がありますが、それ自体fetchRequestの値は変更されないことに注意してください。fetchRequest

これにより、私たちは少し窮地に立たされます。ただし、待ってください。パラメーターの値を喜んで取得し、それが指すものを変更できることはわかっています。の宣言をexecuteFetchRequest:error:見ると、NSError**. それは「へのポインターへのポインターNSError」です。そのため、空の/ぶら下がっている を初期化し、 (単項演算子NSError*を使用して)そのアドレスを見つけて、それを渡すことができます。メソッドは、これが指すものに割り当てることができます。&NSError*

ほら、事実上、オプションの追加の戻り値があります。

于 2012-04-07T23:33:59.277 に答える