だから、私はこれを見ました:
error:(NSError **)error
アップルドキュメントにあります。なぜ2つ星?重要性は何ですか?
だから、私はこれを見ました:
error:(NSError **)error
アップルドキュメントにあります。なぜ2つ星?重要性は何ですか?
「二重星」はポインターへのポインターです。型のオブジェクトへのポインターNSError **
へのポインターも同様NSError
です。基本的に、関数からエラー オブジェクトを返すことができます。関数内でオブジェクトへのポインターを作成しNSError
(それを と呼びます*myError
)、次のようにすることができます。
*error = myError;
そのエラーを呼び出し元に「返す」。
以下に投稿されたコメントへの返信として:
NSError *
C では、関数パラメーターは値によって渡されるため、単純に an を使用することはできません。つまり、関数に渡されるときに値がコピーされます。説明のために、次の C コードのスニペットを考えてみましょう。
void f(int x)
{
x = 4;
}
void g(void)
{
int y = 10;
f(y);
printf("%d\n", y); // Will output "10"
}
x
inの再割り当ては、外部(たとえば in )f()
の引数の値には影響しません。f()
g()
同様に、ポインターが関数に渡されると、その値がコピーされ、再代入は関数の外部の値には影響しません。
void f(int *x)
{
x = 10;
}
void g(void)
{
int y = 10;
int *z = &y;
printf("%p\n", z); // Will print the value of z, which is the address of y
f(z);
printf("%p\n", z); // The value of z has not changed!
}
もちろん、 what の値z
をかなり簡単に変更できることはわかっています。
void f(int *x)
{
*x = 20;
}
void g(void)
{
int y = 10;
int *z = &y;
printf("%d\n", y); // Will print "10"
f(z);
printf("%d\n", y); // Will print "20"
}
したがって、 an がNSError *
指すものの値を変更するには、ポインターをポインターに渡す必要があるのも当然です。
C ではすべてが値渡しです。何かの値を変更したい場合は、そのアドレスを渡します (メモリアドレスの値を渡します)。ポインターが指す場所を変更したい場合は、ポインターのアドレスを渡します。
C では、二重星はポインターへのポインターです。これにはいくつかの理由があります。1 つ目は、ポインターがポインターの配列を指している可能性があることです。もう 1 つの理由は、関数にポインターを渡すことです。関数はポインターを変更します (他の言語の "out" パラメーターに似ています)。
C のようなものであれば**
、ポインターへのポインターを意味します。