Vra

NSInteger/NSUInteger is Kakao-gedefinieerde plaasvervangers vir die gereelde gebou-in tipes.

Is daar enige voordeel vir die gebruik van die NS* tipes oor die gebou-ins?Wat doen jy verkies, en hoekom?Is NSInteger en int dieselfde breedte op 32-bit / 64-bietjie platforms?

Was dit nuttig?

Oplossing

Die manier wat ek dit verstaan, is dat NSInteger et al. is argitektuur veilige weergawes van die ooreenstemmende tipes C. Basies hul grootte is afhanklik van die argitektuur, maar NSInteger, byvoorbeeld, is gewaarborg om enige geldige wyser hou vir die huidige argitektuur.

Apple beveel aan dat jy dit gebruik om te werk met OS X 10.5 en af, en API Apple se: s sal hulle gebruik, so dit is beslis 'n goeie idee om te kry in die gewoonte van die gebruik van hulle. Wat hulle nodig het 'n bietjie meer tik, maar afgesien van wat dit lyk nie of een of ander rede nie om dit te gebruik nie.

Ander wenke

Kwantisering kwessies vir 64-bit runtime

In sommige gevalle kan daar 'n goeie rede om standaard tipes gebruik in plaas van NSInteger wees. "Onverwagse" memory opblaas in 'n 64-bit stelsel

Dit is duidelik dat as 'n heelgetal is 8 in plaas van 4 grepe, die hoeveelheid geheue wat deur waardes verdubbel. Gegee dat nie elke waarde is 'n heelgetal, al is, jy moet tipies nie verwag dat die geheue voetspoor van u aansoek te verdubbel. Maar die manier waarop Mac OS X ken geheue veranderinge, afhangende van die bedrag van versoek geheue.

Op die oomblik, as jy vra vir 512 grepe of minder, malloc rondes van die volgende veelvuldige van 16 grepe. As jy vra vir meer as 512 grepe egter malloc rondes van die volgende veelvuldige van 512 (ten minste 1024 grepe). Veronderstel dan dat jy 'n klas wat definieer - onder andere - verklaar vyf NSInteger byvoorbeeld veranderlikes, en dat op 'n 32-bit stelsel telkens beslaan, sê, 272 grepe. Op 'n 64-bit stelsel, sou gevalle in teorie vereis 544 grepe. Maar, as gevolg van die geheue toekenning strategie, elke sal eintlik beset 1024 grepe ( 'n byna viervoudig verhoog). As jy 'n groot aantal van hierdie voorwerpe gebruik, kan die geheue voetspoor van u aansoek aansienlik groter as wat jy sou verwag nie. As jy die NSInteger veranderlikes met sint_32 veranderlikes vervang, sou jy net gebruik 512 grepe.

As jy die keuse wat skalaar te gebruik, dus, maak seker dat jy iets sinvol te kies. Is daar enige rede waarom jy nie 'n waarde groter nodig as jy nodig in jou 32-bit aansoek? Die gebruik van 'n 64-bis integriteit na 'n aantal sekondes tel is onwaarskynlik nodig om te wees ...

64-bit is eintlik die bestaansdoel vir NSInteger en NSUInteger;voor 10.5, diegene wat nie bestaan het nie.Die twee is eenvoudig gedefinieer as verlang in die 64-bietjie, en as ints in 32-bietjie:

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

Dus, met behulp van hulle in die plek van die meer basiese C tipes wanneer jy wil hê dat die bietjie-moedertaal se grootte.

CocoaDev het'n paar meer inligting.

Ek verkies om die standaard verklarings c styl, maar net omdat ek wissel tussen verskeie tale en ek hoef nie te veel daaroor dink, maar klink soos ek moet begin kyk na nsinteger

Vir die invoer en uitvoer van data na lêers of oor die netto Ek gebruik UInt32 , SInt64 ens ...

Dit is gewaarborg om ongeag die argitektuur van 'n sekere grootte wees en help in porting kode na ander platforms en tale wat ook dié tipes deel.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top