web-dev-qa-db-fra.com

Différence entre int, NSInteger et NSUInteger

Quelle est la principale différence entre int, NSInteger et NSUInteger dans Objective-C?

Lequel est préférable d'utiliser dans une application et pourquoi?

36
Hitarth

Dans de tels cas, vous pouvez cliquer avec le bouton droit et aller à la définition:

#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
29
Bastian

La différence concerne les types abstraits et leurs associés dimensionnés à partir du matériel. D'une manière qui maintenant nous n'avons plus à nous soucier de la taille d'un int ou de la taille de son pointeur sur un matériel particulier.

"C" est mauvais à cela, déclarant seulement qu'un long est au moins aussi grand qu'un int, qu'un int est la taille entière "naturelle" du matériel (quoi que cela signifie), qu'un int soit au moins aussi long que un court - un (gros gâchis).

Cela semblait être une bonne idée à l'époque venant de Fortran, mais ne vieillissait pas bien.

On pourrait utiliser les définitions POSIX, des choses comme uint32_t, int16_t, etc. Mais cela ne traite pas non plus de la taille d'un pointeur sur un matériel particulier.

Donc, si Apple définit le type de retour comme un NSUInteger, vous l'utilisez simplement et vous n'avez pas besoin de savoir s'il a une taille de 16, 32 ou 64 bits pour votre matériel particulier. ( J'ai choisi ces valeurs hors de l'air juste pour un exemple).

Comme vous pouvez le voir dans @Bastian, la taille réelle dépend du matériel.

La documentation répond à la "lettre de la question" mais ne permet pas de comprendre "pourquoi"?

20
zaph