以下のように、なぜ NSError の前に置くのです&error
かerror
?
例えば
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
また、これは常に必要な方法ですか、それとも特定の状況でのみ必要ですか? ありがとう。
以下のように、なぜ NSError の前に置くのです&error
かerror
?
例えば
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
また、これは常に必要な方法ですか、それとも特定の状況でのみ必要ですか? ありがとう。
関数はアドレスを変更する必要があるため、アドレスを取得する必要がありますerror
。はポインタerror
で渡されるため、「アドレスを取る」演算子が必要です。&
C および Objective-C は、パラメータを値で渡します。アンパサンドなしで渡し、呼び出したメソッドがそれを変更した場合、メソッドは のローカル コピーでerror
動作するため、呼び出しを行った関数は変更を認識しません。NSError*
**
メソッドのシグネチャを見て、そこにある場合は、対応するパラメーターの前にアンパサンドが必要であることがわかります。
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error
// ^ one ^^ two
error
パラメータの型は です。これ(NSError **)
は、NSError へのポインタへのポインタです。引数として使用するerror
変数はおそらく として宣言されているNSError *
ため、型を適切に一致させるには、演算子のアドレスを使用してポインターへのポインターを取得する必要があります ( &error
)。そもそもメソッドがポインターへのポインターを必要とする理由は、メソッドの値を変更し、error
その新しい値をメソッドの呼び出し元が使用できるようにするためです。
基本的に、問題の根本は、2 番目の (オプションの) オブジェクトを返したいというハックです。
返せるものは 1 つだけなので、これを行うにはどうすればよいでしょうか。ある種の(return_value, error)
タプルを返すこともできますが、それは少し扱いにくいです。パラメータはいくつでも設定できますが、それらを使って何かできるでしょうか...
したがって、メソッド/関数はそれらのパラメーターを変更できません (正確には、それらはコピーで動作するため、それらが行う変更はローカルです)。つまり、(並行性の問題は別として)質問のメッセージの前の値は、その後fetchRequest
の値と等しくなります。fetchRequest
が指すオブジェクトは変更される可能性がありますが、それ自体fetchRequest
の値は変更されないことに注意してください。fetchRequest
これにより、私たちは少し窮地に立たされます。ただし、待ってください。パラメーターの値を喜んで取得し、それが指すものを変更できることはわかっています。の宣言をexecuteFetchRequest:error:
見ると、NSError**
. それは「へのポインターへのポインターNSError
」です。そのため、空の/ぶら下がっている を初期化し、 (単項演算子NSError*
を使用して)そのアドレスを見つけて、それを渡すことができます。メソッドは、これが指すものに割り当てることができます。&
NSError*
ほら、事実上、オプションの追加の戻り値があります。