2014-05-16 13 views
5

Ho trascorso diverse ore su questo e sono sicuro che mi manca qualcosa di completamente ovvio. Sono nuovo al cacao/obiettivo c e arrugginito con puntatori/oggetti, e quindi apprezzerei molto qualcuno (cortesemente!) Che indica dove sto andando male.Problemi dispari con int e NSInteger

Ecco il mio codice:

.h di file:

@property (assign) NSInteger *freeTrialCounter; 

.m file di

NSInteger a = 2; 
self.freeTrialCounter = &(a); 

NSLog(@"Free Trial Counter: %d", *self.freeTrialCounter); 

int b = *self.freeTrialCounter; 
NSLog(@"B: %d", b); 

ecco l'output: Counter Free Trial: 2B: 1.606.411,536 mila

Cosa mi manca qui? Perché "B" non è uguale a "2"?

+1

Che senso ha creare un puntatore a un 'int' come proprietà? Solo per scopi sperimentali o cosa? Questo non è qualcosa che sembra avere un'applicazione comune nel mondo reale – dandan78

+1

Provato il tuo codice, B restituisce 2 per me. L'unico problema possibile che ho pensato è che NSInteger è in realtà un lungo e non un int. Significa che è a 64 bit e non a 32 bit. Hai la possibile perdita di dati quando esegui la conversione esplicita con 'b' – Yarneo

+0

dandan78 e Yameo: guarda la mia risposta qui sotto all'aiuto di Caleb ... seguiva il consiglio di XCode "& (a)" e mi ha portato fuori strada. (Essendo nuovo in questa lingua, ho pensato che avrei dovuto ascoltare il consiglio dell'IDE ... ora lo so meglio!) Grazie per il vostro tempo e l'assistenza su questo. – user3643251

risposta

3

La radice del problema è che int e NSInteger possono essere di dimensioni diverse. Quindi, stai assegnando un puntatore a un NSInteger a una proprietà di tipo NSInteger*, che va bene (ma inusuale). Tuttavia, stai rinunciando a tale valore come int, che non corrisponde alle stesse dimensioni.

Tuttavia, penso che si possa anche essere confusi su come è necessario dichiarare una proprietà per contenere uno NSInteger. NSInteger è solo un semplice tipo intero, non un oggetto, quindi non è necessario utilizzare un puntatore per fare riferimento ad esso. Questo è doppiamente vero poiché sembra che tu stia dichiarando lo NSInteger il cui indirizzo stai tenendo in pila, quindi il puntatore non sarà valido non appena termina il metodo in cui esegui l'assegnazione.

È molto meglio usare una semplice vecchia proprietà NSInteger e non provare a utilizzare un puntatore qui. Fate questo invece:

@property (assign) NSInteger freeTrialCounter; 
//... 
NSInteger a = 2; 
self.freeTrialCounter = a; 

NSLog(@"Free Trial Counter: %ld", self.freeTrialCounter); 

NSInteger b = self.freeTrialCounter; 
NSLog(@"B: %ld", b); 

Nota che ho cambiato anche il tipo di b per NSInteger modo che corrisponda al tipo di proprietà. Dal momento che non hanno necessariamente le stesse dimensioni, mescolando le due lattine (come hai visto) causano problemi. Allo stesso modo, ho modificato l'identificatore di formato da %d a %ld in modo che corrisponda alla dimensione a 64 bit di NSInteger.

+1

Se voleva usare i puntatori, per qualsiasi ragione, questa è la sua scelta. Non lo stai davvero aiutando a trovare il suo problema. Piuttosto solo dando un'alternativa. – Yarneo

+0

@Yarneo Fai un punto equo e modificherò per risolvere il problema attuale. OTOH, non c'è davvero molto punto per memorizzare un puntatore a un intero come una proprietà, tuttavia, quindi tendo a pensare che l'OP abbia semplicemente commesso un errore. Tu * devi * usare i puntatori per gli oggetti, ma 'NSInteger' non è un tipo di oggetto. – Caleb

+1

Vota da me – Yarneo