2011-10-02 20 views
36

Qual è la differenza principale tra, NSInteger e NSUInteger in Objective-C?Differenza tra int, NSInteger e NSUInteger

Quale è meglio utilizzare in un'applicazione e perché?

+0

Non esiste una cosa come "NSInt". – BoltClock

+0

NSInteger not NSInt .. – Hitarth

+2

[Vedere la documentazione] (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html) – Jiri

risposta

29

In questi casi si potrebbe fare clic destro e vai a definizione:

#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

ok grazie capito – Hitarth

+0

facile e corretto –

20

La differenza è per i tipi astratti e loro associati dimensioni dall'hardware. In un modo che ora non dobbiamo preoccuparci di quale dimensione è un int o quanto è grande il puntatore su un particolare hardware.

"C" è male in questo, solo affermando che un lungo è grande almeno quanto un int, che un int è la dimensione intera "naturale" dell'hardware (qualunque cosa significhi), che un int è a almeno fino a un breve - a (gran casino).

Questa sembrava una buona idea al momento proveniente da Fortran, ma non invecchiare bene.

Si potrebbe usare POSIX, cose come uint32_t, int16_t, ecc. Ma questo non indica quanto grande debba essere un puntatore su un particolare hardware.

Quindi, se Apple definisce il tipo di reso come un NSUInteger, lo si usa e non è necessario sapere se ha 16, 32 o 64 bit per il proprio hardware specifico. (Ho scelto quei valori fuori dal mondo solo per un esempio).

Come potete vedere in @Bastian, la dimensione effettiva dipende dall'hardware.

La documentazione risponde alla "lettera della domanda" ma non fornisce una comprensione del "perché"?

+0

hai ragione. noi otteniamo solo la differenza tra loro ma perché? Non mi sto ancora ottenendo, per favore, suggeriscimi – Hitarth

+3

È standardizzazione API. Questi framework sono disponibili su più architetture: è bello che le API siano uguali a tutti gli altri. Avendo questi typedef, Apple sta estraendo le differenze di piattaforma dai consumatori di API. Se si parla solo con l'API in termini di questi tipi, quindi (in teoria) non è necessario pensare alle differenze della piattaforma quando si compila lo stesso codice per i386, x86_64, ppc, arm7 o altro. È un'astrazione. È stato detto che dovresti usare il più alto livello di astrazione per completare il lavoro. Quindi, a meno che tu non abbia una ragione per NON usare questi tipi, io dico di usarli. – ipmcc

Problemi correlati