Dans le cacao, préférez-vous NSInteger ou int et pourquoi?

NSInteger / NSUInteger sont des remplacements définis par Cocoa pour les types intégrés standard.

Y a-t-il un avantage à utiliser les types NS * sur les éléments intégrés? Lequel tu préfères, et pourquoi? NSInteger et int la même largeur sur les plates-formes 32 bits / 64 bits?

Si je comprends bien, NSInteger et al. sont des versions sécurisées de l’architecture des types C correspondants. Fondamentalement, leur taille varie en fonction de l’architecture, mais NSInteger, par exemple, est garanti pour contenir tout pointeur valide pour l’architecture actuelle.

Apple vous recommande de les utiliser pour travailler avec OS X 10.5 et les versions ultérieures, et l’API d’Apple les utilisera, c’est donc une bonne idée de prendre l’habitude de les utiliser. Ils exigent un peu plus de frappe, mais à part cela, il ne semble pas y avoir de raison de ne pas les utiliser.

Problèmes de quantification pour l’exécution 64 bits

Dans certaines situations, il peut être judicieux d’utiliser des types standard au lieu de NSInteger : une mémoire mémoire “inattendue” dans un système 64 bits.

En clair, si un entier est 8 au lieu de 4 octets, la quantité de mémoire prise par les valeurs est doublée. Étant donné que toutes les valeurs ne sont pas des nombres entiers, vous ne devriez cependant pas vous attendre à ce que l’encombrement mémoire de votre application double. Cependant, la manière dont Mac OS X alloue la mémoire change en fonction de la quantité de mémoire demandée.

Actuellement, si vous demandez 512 octets ou moins, malloc arrondit au multiple de 16 octets suivant. Si vous demandez plus de 512 octets, malloc arrondit au multiple suivant de 512 (au moins 1024 octets). Supposons que vous définissiez une classe qui, parmi d’autres, déclare cinq variables d’instance NSInteger et que, sur un système 32 bits, chaque instance occupe, par exemple, 272 octets. Sur un système 64 bits, les instances nécessiteraient en théorie 544 octets. Mais, en raison de la stratégie d’allocation de mémoire, chacun occupera 1024 octets (soit presque quatre fois plus). Si vous utilisez un grand nombre de ces objects, l’encombrement mémoire de votre application peut être considérablement plus important que prévu. Si vous avez remplacé les variables NSInteger variables sint_32 , vous utiliseriez uniquement 512 octets.

Lorsque vous choisissez quel scalaire utiliser, assurez-vous de choisir quelque chose de sensible. Y a-t-il une raison pour laquelle vous avez besoin d’une valeur supérieure à celle requirejse dans votre application 32 bits? L’utilisation d’un nombre entier de 64 bits pour compter un nombre de secondes ne sera probablement pas nécessaire …

64 bits est en fait la raison d’être de NSInteger et NSUInteger; avant 10.5, ceux-ci n’existaient pas. Les deux sont simplement définis comme longs en 64 bits et en ints en 32 bits:

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

Ainsi, en les utilisant à la place des types C plus basiques lorsque vous voulez la taille “bit-native”.

CocoaDev a plus d’informations.

Je préfère les déclarations de style c standard mais seulement parce que je change de langue et que je n’ai pas besoin de trop y penser, mais je pense que je devrais commencer à regarder nsinteger

Pour importer et exporter des données dans des fichiers ou sur Internet , j’utilise UInt32 , SInt64, etc …

Ceux-ci sont garantis d’une certaine taille indépendamment de l’architecture et aident à porter le code sur d’autres plates-formes et langages qui partagent également ces types.