Alors, j'ai vu ça :
error:(NSError **)error
dans les documents de la pomme. Pourquoi deux étoiles ? Quelle est la signification ?
Alors, j'ai vu ça :
error:(NSError **)error
dans les documents de la pomme. Pourquoi deux étoiles ? Quelle est la signification ?
Une "étoile double" est un pointeur vers un pointeur. Donc NSError **
est un pointeur sur 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-la *myError
), et ensuite faire quelque chose comme ça :
*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 des fonctions sont passés par valeur c'est-à-dire que les valeurs sont copié lorsqu'il est transmis à une fonction. Pour illustrer, considérez 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
sur f()
n'affecte pas la valeur de l'argument en dehors de l'option f()
(en 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
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"
}
Donc, il va de soi que, pour changer la valeur de ce qu'un NSError *
pointe, nous devons également passer un pointeur sur le pointeur.
En C, une étoile double est un pointeur vers un pointeur. Il y a plusieurs raisons de procéder ainsi. La première est que le pointeur peut être 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 langages).
La notation en 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 du double pointeur est utilisée lorsque l'appelant souhaite que l'un de ses propres pointeurs soit modifié 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 liée. L'appelant maintient un pointeur sur le premier nœud. L'appelant invoque des fonctions de recherche, d'ajout et de suppression. Si ces opérations impliquent l'ajout ou la suppression du premier nœud, c'est le pointeur de l'appelant qui doit changer, et non le pointeur suivant dans l'un des nœuds, et vous avez besoin de l'adresse du pointeur pour le faire.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.