Objective-C Language NSInteger et NSUInteger


Exemple

Le NSInteger est juste un typedef pour un int ou un long selon l'architecture. La même chose vaut pour un NSUInteger qui est un typedef pour les variantes non signées. Si vous vérifiez le NSInteger, vous verrez ce qui 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

La différence entre un signe signé et un signe unsigned int ou long est qu’un entier signé ou long peut contenir des valeurs négatives. L'intervalle de l'int est -2 147 483 648 à 2 147 483 647 tandis que le unsigned int a une plage de 0 à 4 294 967 295. La valeur est doublée parce que le premier bit n'est plus utilisé pour dire que la valeur est négative ou pas. Pour une longue et NSInteger sur les architectures 64 bits, la plage est beaucoup plus large.

La plupart des méthodes fournies par Apple renvoient un entier NS (U) au-dessus de l'int normal. Vous recevrez un avertissement si vous essayez de le convertir en un entier normal, car vous perdrez en précision si vous exécutez une architecture 64 bits. Ce n’est pas le cas dans la plupart des cas, mais il est plus facile d’utiliser NS (U) Integer. Par exemple, la méthode count sur un tableau renvoie un NSUInteger.

NSNumber *iAmNumber = @0;

NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];

NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.

Tout comme un BOOL, le NS (U) Integer est un type de données primitif, vous devez donc parfois l'envelopper dans un NSNumber, vous pouvez utiliser le @ avant le nombre entier pour le lancer comme ci-dessus et le récupérer en utilisant les méthodes ci-dessous. Mais pour le convertir en NSNumber, vous pouvez également utiliser les méthodes suivantes:

[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];