«Двойная звезда» - это указатель на указатель. Таким образом, NSError **
является указателем на указатель на объект типа NSError
. Это в основном позволяет вам возвращать объект ошибки из функции. Вы можете создать указатель на NSError
объект в вашей функции (назовите его *myError
), а затем сделать что-то вроде этого:
*error = myError;
чтобы "вернуть" эту ошибку вызывающей стороне.
В ответ на комментарий, размещенный ниже:
Вы не можете просто использовать NSError *
, потому что в C параметры функции передаются значением , то есть значения копируются при передаче в функцию. Чтобы проиллюстрировать это, рассмотрим этот фрагмент кода C:
void f(int x)
{
x = 4;
}
void g(void)
{
int y = 10;
f(y);
printf("%d\n", y); // Will output "10"
}
Переназначение x
в 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!
}
Конечно, мы знаем, что можем довольно легко изменить значение, на которое указывает 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"
}
Таким образом, очевидно, что для изменения значения, на которое указывает NSError *
, мы также должны передать указатель на указатель.