Che cos'è la doppia stella (es. NSError **)?

Che cos'è la doppia stella (es. NSError **)?


Allora, ho visto questo:


error:(NSError **)error

nella mela doc. Perché due stelle? Qual è il significato?


Risposte:


Una "doppia stella" è un puntatore a un puntatore. Quindi NSError ** è un puntatore a un puntatore a un oggetto di tipo NSError . Fondamentalmente ti consente di restituire un oggetto di errore dalla funzione. Puoi creare un puntatore a un NSError oggetto nella tua funzione (chiamalo *myError ), e quindi fare qualcosa del genere:


*error = myError;

per "restituire" quell'errore al chiamante.



In risposta a un commento pubblicato di seguito:


Non puoi semplicemente usare un NSError * perché in C, i parametri delle funzioni vengono passati per valore —ovvero, i valori vengono copiati quando passato a una funzione. Per illustrare, considera questo frammento di codice C:


void f(int x)
{
x = 4;
}
void g(void)
{
int y = 10;
f(y);
printf("%d\n", y); // Will output "10"
}

La riassegnazione di x in f() non influisce sul valore dell'argomento al di fuori di f() (in g() , per esempio).


Allo stesso modo, quando un puntatore viene passato a una funzione, il suo valore viene copiato e la riassegnazione non influirà sul valore al di fuori della funzione.


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!
}

Ovviamente sappiamo che possiamo cambiare il valore di ciò che z indica abbastanza facilmente:


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"
}

Quindi è logico che, per cambiare il valore di ciò che è un NSError * punta a, dobbiamo anche passare un puntatore al puntatore.