objective-c - tutorial - objective c vs c++




Dans Cocoa préférez-vous NSInteger ou int, et pourquoi? (4)

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 * par rapport aux built-ins? Lequel tu préfères, et pourquoi? NSInteger et int la même largeur sur les plates-formes 32 bits / 64 bits?


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

Dans certaines situations, il peut y avoir de bonnes raisons d'utiliser des types standards à la place de NSInteger : NSInteger de NSInteger "inattendue" dans un système 64 bits.

Clairement, si un nombre 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 entiers, vous ne devriez généralement pas vous attendre à ce que l'empreinte mémoire de votre application double. Cependant, la façon 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 suivant de 16 octets. Cependant, si vous demandez plus de 512 octets, malloc arrondit au multiple suivant de 512 (au moins 1024 octets). Supposons ensuite que vous définissiez une classe qui, entre autres, déclare cinq variables d'instance NSInteger et que, sur un système 32 bits, chaque instance occupe, disons, 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 réellement 1 024 octets (une augmentation presque quadruple). Si vous utilisez un grand nombre de ces objets, l'empreinte mémoire de votre application peut être considérablement plus importante que ce à quoi vous pourriez vous attendre. Si vous avez remplacé les variables NSInteger variables sint_32 , vous n'utiliserez que 512 octets.

Lorsque vous choisissez quel scalaire utiliser, assurez-vous de choisir quelque chose de sensé. Y at-il une raison pour laquelle vous avez besoin d'une valeur supérieure à celle dont vous aviez besoin dans votre application 32 bits? L'utilisation d'un nombre entier de 64 bits pour compter un nombre de secondes est peu susceptible d'être 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 dans 64 bits, et comme ints dans 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 les plus basiques quand vous voulez la taille 'bit-native'.

CocoaDev a plus d'infos.


Je préfère les déclarations de style c standard, mais seulement parce que je passe d'une langue à l'autre et que je n'ai pas besoin de trop y réfléchir, mais j'ai l'impression que je devrais commencer à regarder nsinteger


Pour l'importation et l'exportation de données vers des fichiers ou sur le net, j'utilise UInt32 , SInt64 etc ...

Ceux-ci sont garantis pour être d'une certaine taille indépendamment de l'architecture et aident dans le portage du code à d'autres plates-formes et langues qui partagent également ces types.





types