Alors j'ai vu ça:
error:(NSError **)error
dans le Apple doc's. Pourquoi deux étoiles? Quelle est la signification?
Une "double étoile" est un pointeur vers un pointeur. Donc NSError **
Est un pointeur vers un pointeur vers un objet de type NSError
. Il vous permet essentiellement de renvoyer un objet d'erreur à partir de la fonction. Vous pouvez créer un pointeur vers un objet NSError
dans votre fonction (appelez-le *myError
), Puis faites quelque chose comme ceci:
*error = myError;
pour "renvoyer" cette erreur à l'appelant.
En réponse à un commentaire posté ci-dessous:
Vous ne pouvez pas simplement utiliser un NSError *
Car en C, les paramètres de fonction sont passés par valeur - c'est-à-dire que les valeurs sont copiées lorsqu'elles sont passées à une fonction . Pour illustrer, considérons cet extrait de code C:
void f(int x)
{
x = 4;
}
void g(void)
{
int y = 10;
f(y);
printf("%d\n", y); // Will output "10"
}
La réaffectation de x
dans f()
n'affecte pas la valeur de l'argument en dehors de f()
(dans g()
, par exemple).
De même, lorsqu'un pointeur est passé dans une fonction, sa valeur est copiée et la réaffectation n'affectera pas la valeur en dehors de la fonction.
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!
}
Bien sûr, nous savons que nous pouvons changer la valeur de ce que z
pointe assez facilement:
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"
}
Il va donc de soi que, pour changer la valeur de ce vers quoi un NSError *
Pointe, nous devons également passer un pointeur vers le pointeur.
En C, tout passe par valeur. Si vous voulez changer la valeur de quelque chose, vous passez l'adresse de celui-ci (qui passe la valeur de l'adresse mémoire). Si vous voulez changer où pointe un pointeur, vous passez les adresses du pointeur.
En C, une étoile double est un pointeur sur un pointeur. Il y a plusieurs raisons à cela. Premièrement, le pointeur peut être vers un tableau de pointeurs. Une autre raison serait de passer un pointeur à une fonction, où la fonction modifie le pointeur (similaire à un paramètre "out" dans d'autres langues).
La notation double étoile (**) n'est pas spécifique à l'initialisation d'une variable dans une classe. Il s'agit simplement d'une double référence indirecte à un objet.
float myFloat; // an object
float *myFloatPtr; // a pointer to an object
float **myFloatPtrPtr; // a pointer to a pointer to an object
myFloat = 123.456; // initialize an object
myFloatPtr = &myFloat; // initialize a pointer to an object
myFloatPtrPtr = myFloatPtr; // initialize a pointer to a pointer to an object
myFloat; // refer to an object
*myFloatPtr; // refer to an object through a pointer
**myFloatPtrPtr; // refer to an object through a pointer to a pointer
*myFloatPtrPtr; // refer to the value of the pointer to the object
La notation à double pointeur est utilisée lorsque l'appelant a l'intention de modifier l'un de ses propres pointeurs par un appel de fonction, de sorte que l'adresse du pointeur, au lieu de l'adresse de l'objet, est transmise à la fonction.
Un exemple pourrait être l'utilisation d'une liste chaînée. L'appelant maintient un pointeur vers le premier nœud. L'appelant appelle des fonctions pour rechercher, ajouter et supprimer. Si ces opérations impliquent l'ajout ou la suppression du premier nœud, le pointeur de l'appelant doit changer, pas le pointeur .next dans l'un des nœuds, et vous avez besoin de l'adresse du pointeur pour ce faire.
Si c'est quelque chose comme C alors **
signifie un pointeur vers un pointeur.