10
votes

Quand devriez-vous utiliser l'astérisque (*) lorsque vous déclarez une variable dans l'objectif c

Je viens de commencer à apprendre l'objectif C et l'astérisque me donne des problèmes. Comme je lance le code de l'échantillon, il est parfois utilisé lors de la déclaration d'une variable et parfois ce n'est pas le cas. Quelles sont les "règles" pour quand il devrait être utilisé. Je pensais que cela avait quelque chose à voir avec le type de données de la variable. (Asterisk nécessaire pour les types de données d'objet, non nécessaires aux types de données simples tels que INT), j'ai vu des types de données d'objet tels que CGPoint déclaré sans l'astérisque? Y a-t-il une réponse définitive ou cela a-t-il à voir avec la manière dont vous utilisez la variable?


0 commentaires

6 Réponses :


6
votes

L'astérisque indique que la variable est un pointeur sur un type de données.

Vous devriez examiner Pointants pour plus d'informations. Ils sont un aspect très important et fondamental de la programmation.


2 commentaires

Je comprends que cela signifie que c'est un pointeur. Mais mes questions sont quand vous devriez ou ne devriez-vous pas être utilisée?


Cela dépend entièrement de la situation. Vous devez utiliser une mémoire allouée en tas si vous souhaitez renvoyer une valeur d'une fonction, par exemple, car sinon, il serait récupéré lorsque la fonction se déroule. Les pointeurs sont également nécessaires aux tableaux de référencement. Ce n'est pas une question facile à répondre, Jason. La répartition de la pile est utile car vous n'avez pas à vous inquiéter autant de mémoire, mais il suffit d'utiliser des objets entièrement alloués par pile que vous n'avez pas besoin de traiter avec des pointeurs. Mais fondamentalement, si votre type est petit et de courte durée, ne vous inquiétez pas avec les pointeurs. S'il est grand ou de longue durée, utilisez des pointeurs.



7
votes

Je pense que vous devriez lire un peu sur la programmation C en premier. Objective-C est un superset de C. La raison pour laquelle vous n'utilisez pas * pour déclarer CGPoint est que CGPoint est une structure, jetez un oeil dans le fichier d'en-tête CGGEOMETRY.H.


2 commentaires

C'est la vraie clé. Pour le type en question, accédez au fichier .h où il est défini et cherche à voir s'il s'agit d'une structure ou d'une classe. Si c'est une classe, vous avez besoin de *; Si c'est une structure, vous n'en avez pas besoin pour une utilisation normale, bien que vous puissiez si vous voulez - mais c'est un sujet plus avancé.


Oui, c'est de ma faute. J'ai faussement supposé que CGPoint était un type de données d'objet et cela a causé presque toute la confusion sur mon point. Y a-t-il quelque chose de spécifique que je devrais rechercher dans le fichier .h pour savoir s'il est ou objet. Est-ce aussi facile que de regarder ce que la superclasse est?



0
votes

sonne comme si vous avez la règle énoncée: astérisque pour pointeur, aucun astérisque, sinon. Le problème est qu'il n'y a aucune règle pour déterminer si quelque chose comme CGPoint nécessitera un pointeur sans regarder le fichier d'en-tête. Comme le dit Welbog, la distinction réelle entre quand utiliser / ne pas utiliser un pointeur est de savoir si vous allociez sur le tas ou la pile, bien que la plupart du temps aurez besoin de déterminer si vous travaillez avec un objet ( astérisque) ou une primitive (pas d'astérisque).


0 commentaires

17
votes

Quelles sont les "règles" pour quand il devrait être utilisé.

Vous utilisez l'astérisque pour déclarer un pointeur.

Pour un objet de cacao, vous déclarez toujours un pointeur, vous utilisez donc toujours un astérisque. Vous ne pouvez pas mettre l'objet lui-même dans la variable; Vous gérez toujours un pointeur sur l'objet.

Pour d'autres choses, cela dépend de la question de savoir si la variable contiendra l'objet (dans le sens C) ou un pointeur à l'objet - quelque part d'autre. Si la variable doit contenir l'objet, vous ne le déclarez pas avec un astérisque, car vous ne mettez pas un pointeur dedans. S'il doit contenir un pointeur, alors vous le déclarez avec un astérisque.

Vous pouvez même avoir un pointeur à un pointeur; Comme vous pouvez vous attendre, cela implique plusieurs astérisques. Par exemple, nsrect ** est un pointeur sur un pointeur sur un nsrect (qui est une structure, pas un objet de cacao).

Je pensais que cela avait quelque chose à voir avec le type de données de la variable. (Astérisque nécessaire pour les types de données d'objet, non nécessaires aux types de données simples tels que INT)

sorte de. L'astérisque est nécessaire pour les objets de cacao, car vous ne pouvez gérer que des pointeurs sur des objets de cacao, jamais les objets eux-mêmes. Mais les règles de déclaration ne sont pas différentes pour les objets de cacao; Ils sont exactement les mêmes. Vous utilisez l'astérisque lorsque vous souhaitez une variable de pointeur; Vous ne voulez pas quand vous voulez une variable non-pointeur.

La seule exception, la seule différence pour les objets de cacao des règles habituelles, est que vous n'êtes pas autorisé à déclarer une variable qui détient l'objet lui-même. C'est pourquoi vous ne voyez jamais une variable tenant un objet de cacao au lieu d'un pointeur à un: le compilateur ne le permettra pas.

Cependant, j'ai vu des types de données d'objet tels que CGPoint déclaré sans l'astérisque aussi?

CGPoint est une structure, pas un objet de cacao. En tant que tel, vous pouvez déclarer une variable qui contient un CGPoint et non un pointeur à un ailleurs.


3 commentaires

Une note (largement historique): toutes les saveurs de l'objectif-c requises ont nécessité des "pointeurs d'objets". Certains vous ont même permis de créer des objets sur la pile sous forme d'objet NsObject; .


En grande partie, peut-être, mais pas entièrement historique: sur Gnustep, IIRC, vous pouvez toujours déclarer un objet sur la pile.


Err, non. Gnustep est, à toutes fins pratiques, une bibliothèque partagée - essentiellement un clone d'appkit.framework andound Foundation.framework (c'est-à-dire la spécification OpenStep ). Gnustep a leur propre runtime également (libobjc). Objective-C "classique", qui définirais, je définirais jusqu'à Pommes Objective-C 1.0, est une langue incroyable. Il fournit quelques primitives simples et peu de dogme sur la façon dont vous devriez les utiliser, ce qui n'est pas une surprise compte tenu de son héritage. La plupart considèrent que c'est un "superset strict" du C, il est superposé sur. Pas ainsi avec Objc2 (c.-à-d. GC et Void * Les pointeurs, par exemple).



4
votes

Vous utilisez un * code> lorsque le type de variable est une classe.

Un exemple peut aider. p> xxx pré>

Le nsnumber Code> Type de variable est une classe tandis que Nsinteger code> est juste un autre nom pour un type C normal C-type int code>. Comme vous pouvez le constater ici, le compilateur remplace chaque occurrence de NSInteger code> avec int code>: p> xxx pré>


plus loin, Vous ne pouvez pas déclarer une instance d'une classe (un objet), comme nsnumber code>, sans utiliser de pointeur (vous utilisez ainsi un * code>). La raison en est que lorsque vous ALLOC CODE> une instance d'une classe en tant qu'objet Une adresse de mémoire est renvoyée. Un pointeur est un type de variable qui fait spécifiquement référence à un emplacement de mémoire. Par exemple: P>

integer += 4;


1 commentaires

Parlant à votre question sur CGPoint, vous devez savoir que CGPoint n'est pas une classe. C'est une structure. Ainsi, vous pouvez disposer de CGPoints statiques non mutables alloués à la compilation du code. Sur le côté bascule, si vous allouiez de manière dynamique un CGPoint pendant la période d'exécution, vous utiliseriez un pointeur CGPoint (cgoint * cgpointer) pour référencer la variable en mémoire. Avoir un sens?



0
votes

La réponse est très simple: vous devriez Toujours Utilisez l'astérisque lors de l'utilisation d'objets de l'objectif-C.

La raison en est qu'ils ne peuvent pas être alloués sur la pile, vous ne pouvez donc pas faire ce que vous pouvez faire avec des structures telles que CGPoint.

Les concepteurs de l'objectif-C ont choisi, je suppose que vous pouvez toujours ajouter cet astérisque car ils sont des pointeurs en mémoire comme d'autres points C.


0 commentaires