42 votes

Pourquoi ne pas déclarer NSInteger avec un *

Je tente ma main à l'iPhone cours de Stanford sur iTunes U et je suis un peu confus sur les pointeurs. Dans la première mission, j'ai essayé de faire quelque chose comme ceci

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

Ce qui a généré une erreur, après tinkeing autour de aveuglément, j'ai découvert que c'était le * dans la NSInteger ligne qui a été à l'origine du problème.

Donc je ne comprends pas ce qui se passe. Je vais vous expliquer comment je pense qu'il fonctionne et peut-être que quelqu'un serait assez aimable pour souligner la faille.

À la différence dans le développement web, j'ai maintenant besoin de à vous soucier de la mémoire, bien, plus que dans le développement web. Alors, quand je créer une variable, il est attribué un peu de mémoire quelque part (RAM je supposons). Au lieu de passer le variable autour de moi, je passe un pointeur vers que peu de mémoire autour de. Et les pointeurs sont déclarées par la préfixation de la nom de la variable avec un *.

En supposant que je suis de droite, ce qui m'intrigue, c'est pourquoi n'ai-je pas besoin de le faire pour NSInteger?

72voto

Dan Lorenc Points 4180

NSInteger est un type primitif, ce qui signifie qu'il peut être stocké localement sur la pile. Vous n'avez pas besoin d'utiliser un pointeur pour y accéder, mais vous pouvez si vous le souhaitez. La ligne:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

retourne une variable réelle, pas son adresse. Pour résoudre ce problème, vous devez supprimer l' *:

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

Vous pouvez avoir un pointeur vers une NSInteger si vous voulez vraiment un:

NSInteger *pointerToProcessID = &processID;

L'esperluette est l'adresse de l'exploitant. Il définit le pointeur à l' NSInteger égale à l'adresse de la variable dans la mémoire, plutôt qu'à la valeur entière de la variable.

25voto

Alex Rozanski Points 26107

La raison que vous n'avez pas à déclarer NSInteger avec un * est parce qu'il n'est pas un objet. Un NSInteger est tout simplement un int ou long:

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

Si il est utilisé dans une application 32 bits, c'est un entier de 32 bits, et si il est intégré dans une application 64 bits, il est un entier de 64 bits.

Bien sûr, vous pouvez passer un NSInteger comme un pointeur, mais la plupart des fonctions simplement prendre des arguments comme un NSInteger et non pas un pointeur.

Des objets, d'autre part, ne peuvent être transmises à d'autres fonctions comme des pointeurs. C'est parce que les objets ont de la mémoire allouée dynamiquement pour eux, et ne peuvent donc pas être déclaré sur la pile. Depuis un int ou long a un montant fixe de mémoire allouée pour eux, ce n'est pas un problème.

3voto

Peter Hosey Points 66275

Le * signifie "pointeur". La variable objet contient un pointeur sur un objet et a donc * ; la variable NSInteger contient un NSInteger et non un pointeur sur un NSInteger. Par conséquent, elle n'a pas * . Le fait de placer * sur cette variable vous donne au moins un avertissement car vous mettez un entier dans une variable de pointeur.

2voto

Andrei Tanasescu Points 361

NSInteger est juste un typedef pour int, autant que je sache.

Prograide.com

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.

Powered by:

X