348 votes

Quand utiliser NSInteger ou int.

Quand dois-je utiliser NSInteger vs. int lors du développement pour iOS ? Je vois que dans l'exemple de code d'Apple, ils utilisent NSInteger (ou NSUInteger ) lors du passage d'une valeur en tant qu'argument à une fonction ou du retour d'une valeur à partir d'une fonction.

- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...

Mais dans une fonction, ils utilisent simplement int pour suivre une valeur

for (int i; i < something; i++)
...

int something;
something += somethingElseThatsAnInt;
...

J'ai lu (on m'a dit) que NSInteger est un moyen sûr de référencer un entier, que ce soit dans un environnement 64 ou 32 bits. int du tout ?

325voto

Jacob Relkin Points 90729

Vous voulez généralement utiliser NSInteger lorsque vous ne savez pas sur quel type d'architecture de processeur votre code peut s'exécuter, vous pouvez, pour une raison quelconque, vouloir le plus grand type d'entier possible, ce qui, sur les systèmes 32 bits, est juste un int alors que sur un système 64 bits, il s'agit de long .

Je m'en tiendrais à l'utilisation de NSInteger au lieu de int / long à moins que vous ne les exigiez spécifiquement.

NSInteger / NSUInteger sont définis comme *dynamiques typedef *s à l'un de ces types, et ils sont définis comme suit :

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

En ce qui concerne le spécificateur de format correct que vous devez utiliser pour chacun de ces types, voir la rubrique La section sur les dépendances de la plate-forme du Guide de programmation de la chaîne.

4 votes

De plus, je dirais qu'il est préférable d'utiliser NSInteger, sauf si vous avez spécifiquement besoin de int ou long int.

0 votes

L'exemple de code d'apple utilisant les deux n'a donc aucun sens puisqu'il ne bénéficie d'aucun des avantages de NSInteger ?

1 votes

@Shizam dans ce cas spécifique, je dirais que l'utilisation de int est parfait car vous savez quelle est la limite supérieure. ( something ) - Si vous ne savez pas ce que c'est, il serait plus logique d'utiliser NSInteger .

44voto

Only You Points 1070

Pourquoi utiliser int du tout ?

Apple utilise int parce que pour une variable de contrôle de boucle (qui est seulement utilisée pour contrôler les itérations de la boucle) int est parfait, tant en ce qui concerne la taille du type de données que les valeurs qu'il peut contenir pour votre boucle. Il n'est pas nécessaire d'utiliser un type de données dépendant de la plate-forme ici. Pour une variable de contrôle de boucle, même un int fera la plupart du temps.

Apple utilise NSInteger pour une valeur de retour de fonction ou pour un argument de fonction car dans ce cas, le type de données [taille] est important. car ce que vous faites avec une fonction, c'est communiquer/passer des données avec d'autres programmes ou avec d'autres morceaux de code ; voir la réponse à la question suivante Quand dois-je utiliser NSInteger ou int ? dans votre question elle-même...

ils [Apple] utilisent NSInteger (ou NSUInteger) lors du passage d'une valeur comme un argument à une fonction ou renvoyer une valeur d'une fonction.

32voto

Darren Points 13973

OS X est "LP64". Cela signifie que :

int est toujours de 32 bits.

long long est toujours de 64 bits.

NSInteger y long sont toujours de la taille d'un pointeur. Cela signifie qu'ils sont de 32 bits sur les systèmes 32 bits, et de 64 bits sur les systèmes 64 bits.

La raison pour laquelle NSInteger existe est que de nombreuses API anciennes utilisaient de manière incorrecte int au lieu de long pour contenir des variables de la taille d'un pointeur, ce qui signifiait que les API devaient passer du format int à long dans leurs versions 64 bits. En d'autres termes, une API aura des signatures de fonctions différentes selon que vous compilez pour des architectures 32 bits ou 64 bits. NSInteger entend masquer ce problème avec ces anciennes API.

Dans votre nouveau code, utilisez int si vous avez besoin d'une variable 32 bits, long long si vous avez besoin d'un entier de 64 bits, et long ou NSInteger si vous avez besoin d'une variable de la taille d'un pointeur.

26 votes

L'histoire est exacte, mais les conseils sont terribles. Si vous avez besoin d'une variable 32 bits, utilisez int32_t . Si vous avez besoin d'un entier 64 bits, utilisez int64_t . Si vous avez besoin d'une variable de la taille d'un pointeur, utilisez intptr_t .

5 votes

Stephen, votre conseil est de ne jamais utiliser int, long, ou NSInteger alors ?

8 votes

Non, mon conseil est de ne jamais les utiliser si vous avez besoin d'un type entier de taille fixe connue. Le site <stdint.h> Il existe des types de produits destinés à cette fin.

26voto

Evan Mulawski Points 28536

Si vous creusez dans l'implémentation de NSInteger :

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

Simplement, le typedef NSInteger fait un pas pour vous : si l'architecture est 32 bits, il utilise int s'il est 64 bits, il utilise long . En utilisant NSInteger, vous n'avez pas à vous soucier de l'architecture sur laquelle le programme est exécuté.

15 votes

Vous devez vous inquiéter, car le spécificateur de format correct pour NSInteger dépend de l'architecture.

1 votes

La méthode la plus simple, selon le manuel d'Apple, consiste à attribuer une valeur au type numérique le plus important long long . Ainsi, tous les types numériques utiliseront le même spécificateur de type.

7 votes

Maintenant, la façon la plus simple de formater est de les mettre en boîte - NSLog("%@", @(1123));

11voto

Ash Points 1191

Vous devez utiliser NSInteger si vous devez les comparer à des valeurs constantes telles que NSNotFound ou NSIntegerMax, car ces valeurs seront différentes sur les systèmes 32 bits et 64 bits. Pour les valeurs d'index, les comptages et autres, utilisez NSInteger ou NSUInteger.

Il n'y a pas de mal à utiliser NSInteger dans la plupart des cas, sauf qu'il prend deux fois plus de mémoire. L'impact sur la mémoire est très faible, mais si vous avez une grande quantité de nombres flottants à un moment donné, l'utilisation des ints peut faire la différence.

Si vous utilisez NSInteger ou NSUInteger, vous voudrez les convertir en entiers longs ou en entiers longs non signés lorsque vous utilisez des chaînes de format, car la nouvelle fonctionnalité de Xcode renvoie un avertissement si vous essayez d'enregistrer un NSInteger comme s'il avait une longueur connue. Vous devez également faire attention lorsque vous les envoyez à des variables ou des arguments qui sont typés comme des ints, car vous pouvez perdre de la précision dans le processus.

Dans l'ensemble, si vous ne vous attendez pas à en avoir des centaines de milliers en mémoire en même temps, il est plus facile d'utiliser NSInteger que de se soucier constamment de la différence entre les deux.

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