2010-04-03 8 views

Répondre

1

Courir ceci:


    int sizeLong = sizeof(unsigned long); 
    int sizeInt = sizeof(unsigned int); 
    NSLog(@"%d, %d", sizeLong, sizeInt); 

sur 64bits donne: 8, 4 sur 32 bits donne: 4, 4 Alors que oui, sur 64 bits non signés à long (NSUInteger) prend deux fois plus de mémoire que NSUInteger sur 32 bits.

0

Cela fait très peu de différence dans votre cas, il n'y a pas de vrai ou de faux. Je pourrais utiliser un NSUInteger, juste pour faire correspondre avec des trucs Cocoa API.

NSUInteger est défini comme ceci:

#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 
+0

Merci. Donc, sur 64 bits mon NSUInteger sera un long droit non signé? Cela n'occupe-t-il pas deux fois plus de mémoire que l'utilisation d'int? –

+0

Oui, c'est vrai. Un 'long' sera de 8 octets et un' int' sera de 4 octets, sur une cible de 64 bits. Sur 32 bits, 'int' et' long' sont les mêmes. –

0

Quand tu veux vraiment utiliser une partie du type non signé, le choix entre unsigned int et NSUInteger n'a pas d'importance parce que ces types sont égaux (en comparant la gamme et la taille en 32 & 64 bits). De même pour int et NSInteger:


#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 
+0

Merci. Donc, sur 64 bits mon NSUInteger sera un long droit non signé? Cela n'occupe-t-il pas deux fois plus de mémoire que l'utilisation d'int? –

3

J'irais avec soit NSUInteger (comme le type entier non signé idiomatique général dans Cocoa) ou uint8_t (si la taille compte). Si je m'attendais à utiliser des valeurs 0-30 dans plusieurs endroits pour le même type de données, je le typerais pour décrire ce qu'il représente.

+0

+1 pour avoir réfléchi à ce qui est théoriquement le plus correct au lieu de simplement combien d'octets seront gaspillés. – andyvn22

0

Personnellement, je viens d'être mordu par ce choix. Je suis descendu la route NSUInteger et j'ai juste passé des heures à regarder dans un bug obscur.

J'ai eu le code qui a choisi un nombre aléatoire et a retourné un NSUInteger. Le code pour le compte sur le débordement du nombre. Cependant je n'ai pas anticipé que la taille du nombre a varié entre les systèmes 32bit et 64bit. Le reste de mon code a supposé (incorrectement) que le nombre serait jusqu'à 32 bits. Le résultat est que le code fonctionnait parfaitement sous les périphériques 32 bits, mais sur l'iPhone 5S, tout s'est effondré.

Il n'y a rien de mal à utiliser NSUInteger, mais il vaut la peine de se souvenir que la plage de nombres est significativement plus élevée, donc prenez en compte ce dynamisme dans les maths que vous faites avec ce nombre.