Pourquoi dois-je écrire * myPointerVar uniquement PARFOIS en Objective-C?

C’est un problème que je ne comprends toujours pas.

Parfois je dois écrire:

NSSsortingng* myVariable; myVariable = @"Hey!"; 

Ensuite, par exemple, je définis une structure “DemoStruct” et récupère une variable qui l’utilise. Disons que j’ai une structure qui a x et y vars de type double.

Je souhaite transmettre cette variable à une méthode qui manipule ensuite ma variable, et je souhaite que cette manipulation ait un effet sur le contexte à partir duquel j’ai transmis la variable à cette méthode. J’ai donc besoin d’un pointeur, d’accord.

Je le passe à la méthode comme ça:

 [someObject someMethod:&myVarThatUsesTheStruct] 

cette méthode ressemble maintenant à ça:

 - (void)someMethod:(DemoStruct*)myVar { (*myVar).x += 10; } 

Avant l’appel, le composant x de la structure était 1000. Maintenant, 10 est ajouté et il est 1010 après l’appel de la méthode.

Mais je ne comprends vraiment pas très bien pourquoi je dois utiliser l’astérisque * pour myVar dans la méthode, puisque je dis déjà dans l’en-tête de méthode que myVar est un pointeur pour un DemoStruct. Je passe juste avec & myVarThatUsesTheStruct l’adresse mémoire.

Quelqu’un peut-il expliquer pourquoi c’est comme ça?

Comme vous le dites, myVar est un pointeur. En tant que tel, myVar.x n’est pas correct: ce serait par le biais d’un champ d’un pointeur, ce qui n’a aucun sens dans C / Objective-C.

Si vous souhaitez accéder à la variable pointée par un pointeur, vous devez append l’astérisque: myVar est un pointeur, *myVar est la variable pointée par myVar .

De plus, dans votre cas, vous pouvez utiliser une construction spéciale de C en écrivant myVar->x , ce qui est ssortingctement équivalent à (*myVar).x .

Tout cela correspond à la norme C, non spécifique à Objective-C.

En ce qui concerne votre premier exemple, vous n’avez pas besoin de mettre un astérisque car vous modifiez la valeur du pointeur, pas la valeur de la variable: myVariable est un pointeur sur un object auquel la valeur nil est atsortingbuée au moment de la déclaration. L’instruction suivante ( myVariable = @"Hey!" ) Est une affectation de valeurs de pointeur: @"Hey!" est un pointeur sur un object NSSsortingng . La valeur de ce pointeur (et non de la constante pointée) est atsortingbuée à myVariable , qui pointe ensuite sur l’object @"Hey!" .

Oui, c’est difficile à suivre la première fois …

* est l’opérateur de déréférence. Tout ce que * myVar signifie, c’est “Donne-moi la chose sur laquelle pointe le pointeur myVar”. Vous avez besoin de cette distinction, car vous devez indiquer à l’ordinateur que vous souhaitez modifier l’élément signalé par myVar, et non pas myVar.

tiré du lien c de l’objective d’apprentissage via le portail des développeurs pour iphone devs:

Objective-C prend en charge les typages fort et faible pour les variables contenant des objects. Les variables fortement typées incluent le nom de la classe dans la déclaration du type de variable. Les variables faiblement typées utilisent à la place le type id. Les variables faiblement typées sont fréquemment utilisées pour des choses telles que les classes de collection, où le type exact des objects d’une collection peut être inconnu. Si vous avez l’habitude d’utiliser des langages fortement typés, vous pourriez penser que l’utilisation de variables faiblement typées poserait des problèmes, mais elles offrent en réalité une flexibilité considérable et permettent un dynamisme beaucoup plus grand dans les programmes Objective-C.

L’exemple suivant montre des déclarations de variable fortement et faiblement typées:

MyClass * myObject1; // frappe fort

id myObject2; // saisie faible

Notez le * dans la première déclaration. En Objective-C, les références d’object sont des pointeurs. Si cela ne vous semble pas parfaitement logique, ne vous inquiétez pas: vous n’avez pas besoin d’être un expert en pointeurs pour pouvoir commencer à programmer avec Objective-C. Vous devez simplement vous rappeler de mettre le * devant les noms de variables pour les déclarations d’object fortement typées. Le type id implique un pointeur.