2009-11-17 2 views
83

Per esempio quando si passa un messaggio value a un NSInteger un'istanza in questo modoCome convertire An NSInteger in un int?

[a value] provoca un EXC_BAD_ACCESS.

Quindi, come convertire un NSInteger in int?

Se rilevante, vengono utilizzati solo numeri piccoli < 32.

+2

Sembra che tu sia piuttosto confuso. [un valore] suggerisce che tu debba essere un oggetto, ma che è un NSInteger al momento. "Converting" in un int non risolverà il problema. –

risposta

179

Ta da:

NSInteger myInteger = 42; 
int myInt = (int) myInteger; 

NSInteger non è altro che un 32/64 bit int. (utilizzerà la dimensione appropriata in base al sistema operativo/piattaforma in uso)

+11

Per essere precisi, penso che NSInteger sia un int su piattaforme a 32 bit e una lunga su piattaforme a 64 bit. –

+4

Viene visualizzato un avviso utilizzando il "casting" suggerito: la conversione implicita perde la precisione dei numeri interi: "NSUInteger" (noto anche come "unsigned long") a "int" – djcj

+0

@djcj, sì, la risposta non è corretta per i nuovi SDK. Credo. – NAZIK

17

Non sono sicuro delle circostanze in cui è necessario convertire un NSInteger in un int.

NSInteger è solo un typedef:

NSInteger Usato per descrivere un numero intero indipendentemente dal fatto che si sta costruendo un 32 bit o un sistema a 64 bit.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

È possibile utilizzare NSInteger qualsiasi luogo si utilizza un int senza convertirlo.

+2

Ecco una buona ragione per voler convertire un NSUinteger in un confronto di valori int: (int i = -1)> (NSUinteger j = 14) converte l'int in unsigned, ovvero -1> 14, che non è quello che vuoi. –

+1

@ SamuelClay. Un buon punto quando usato in casi specifici. Personalmente, convertirei un NSUInteger in un uint. Però. La domanda riguardava la conversione di NSInteger, non di NSUInteger. – Abizern

+0

Ho usato solo un int unsigned per illustrare un errore comune. È lo stesso tipo di cast per entrambi, come dimostra la mia risposta.Non è un problema difficile, ma è abbastanza comune e devo ancora vedere qualcuno raccomandare una risposta a linea singola. –

28

Se si vuole fare questo in linea, appena gettato la NSUInteger o NSInteger a un int:

int i = -1; 
NSUInteger row = 100; 
i > row // true, since the signed int is implicitly converted to an unsigned int 
i > (int)row // false 
+1

Solo per curiosità, perché stai postando una risposta 2 anni dopo il fatto su una domanda che ha già una risposta accettata con voti a due cifre? Soprattutto perché il tuo è solo una riformulazione di quella risposta. –

+6

Perché la mia risposta è una singola riga (utilizzando un cast di tipo inline - il (int)), che penso sia ciò che l'OP potrebbe desiderare. Ho esaminato me stesso e ho notato che tutte le risposte sull'argomento erano multi-linea. –

+2

La risposta accettata dimostra una conversione implicita utilizzando una singola riga. La risposta di Abizern spiega che una conversione implicita avverrà se si tenta di utilizzare un valore 'NSInteger' al posto di un' int'. In nessun caso è una soluzione multi-linea. –

0

Comunemente utilizzati nel UIsegmentedControl, "errore" compare durante la compilazione in 64bit invece di 32bit, modo più semplice per non aver passare ad una nuova variabile è quello di utilizzare questo consigli, aggiungere (int):

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]]; 

invece di:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];