Domanda

NSInteger/NSUInteger Cacao-definito di parti di ricambio per il regolare built-in tipi.

C'è qualche beneficio di usare il NS* tipi di oltre il built-in?Quale preferite e perché?Sono NSInteger e int la stessa larghezza di 32-bit / 64-bit?

È stato utile?

Soluzione

Il modo in cui ho capito è che NSInteger et al.sono l'architettura di sicurezza versioni dei corrispondenti tipi C.Fondamentalmente le dimensioni variano a seconda dell'architettura, ma NSInteger, per esempio, è garantito a contenere un puntatore valido per l'attuale architettura.

Apple consiglia di utilizzare questi per funzionare con OS X 10.5 e poi, e Apple API:s li uso, quindi è sicuramente una buona idea per ottenere l'abitudine di usarli.Essi richiedono un po ' più di digitazione, ma a parte che non sembra essere alcun motivo per non usarli.

Altri suggerimenti

Quantizzazione problemi per la versione a 64 bit di runtime

In alcune situazioni ci possono essere buone ragioni per utilizzare tipi standard invece di NSInteger:"imprevisto", memoria di gonfiare in un sistema a 64 bit.

Chiaramente se un numero intero è di 8 invece di 4 byte, la quantità di memoria occupata da valori è raddoppiato.Dato che ogni valore è un numero intero, anche se, in genere è necessario non aspettarsi il footprint di memoria dell'applicazione per il doppio.Tuttavia, il modo in cui Mac OS X alloca la memoria cambia a seconda della quantità di memoria richiesta.

Attualmente, se si richiede 512 byte o meno, malloc arrotonda per eccesso al multiplo di 16 byte.Se chiedete per più di 512 byte, tuttavia, malloc arrotonda per eccesso al multiplo di 512 (almeno 1024 byte).Supponiamo quindi che è possibile definire una classe che-tra gli altri-dichiara cinque NSInteger le variabili di istanza, e che su un sistema a 32 bit ogni istanza occupa, diciamo, 272 byte.Su un sistema a 64 bit, istanze, in teoria, dovrebbero richiedere 544 byte.Ma, a causa della strategia di allocazione di memoria, ciascuno effettivamente occupano di 1024 byte (un aumento di quasi quattro volte).Se si utilizza un gran numero di questi oggetti, il footprint di memoria dell'applicazione potrebbe essere molto maggiore di quanto si potrebbe altrimenti aspetta.Se hai sostituito il NSInteger le variabili con sint_32 le variabili, si utilizzerà solo 512 byte.

Quando si sceglie quello che scalare da utilizzare, di conseguenza, assicurarsi di scegliere qualcosa di sensato.C'è qualche motivo per cui avete bisogno di un valore maggiore di cui aveva bisogno il vostro applicazione a 32 bit?Utilizzando un intero a 64 bit di conteggio di un numero di secondi è improbabile che sia necessario...

64-bit è in realtà la ragion d'essere per NSInteger e NSUInteger;prima di 10.5, quelli non esistono.I due sono semplicemente definito come anela a 64-bit, e come interi a 32 bit:

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

Pertanto, il loro utilizzo in luogo di più di base di tipo C quando si desidera che il 'bit nativo dimensioni.

CocoaDev ha qualche info in più.

Io preferisco il c standard dichiarazioni di stile, ma solo perché posso passare tra diverse lingue e non devo pensare troppo su di esso, ma sembra che dovrebbe iniziare a guardare nsinteger

Per l'importazione e l'esportazione dei dati in file o in rete io uso UInt32, SInt64 ecc...

Questi sono garantiti per essere di una certa dimensione, indipendentemente dall'architettura e di aiutare il porting di codice per altre piattaforme e linguaggi che condividono anche quei tipi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top