2010-11-18 15 views
1

J'ai un int currentFontSize où je veux comparer avec NSString stocké dans un tableau C, voici le code. La partie strage est, val me donner une valeur de retour de 1879919632, ce qui rend ma comparaison échouée. La partie étrange est quand je hardcode le NSString comme val2 = @ "22", la comparaison devient réussie où val2 est: 4240, il est le même que:int stringWithFormat à NSString valeur de retour

NSLog(@"fontSizeNAme:%d",fontSizeName[i]); 

ici est mon retour à NSLog:

2010-11-18 16:56:52.784 testINT[26034:a0f] the current font size is 22 
2010-11-18 16:56:52.786 testINT[26034:a0f] the current font Value1 is 1879919632 
2010-11-18 16:56:52.787 testINT[26034:a0f] the current font Value2 is 4240 
2010-11-18 16:56:52.788 testINT[26034:a0f] fontSizeNAme:4176 
2010-11-18 16:56:52.788 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.788 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.789 testINT[26034:a0f] fontSizeNAme:4208 
2010-11-18 16:56:52.789 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.790 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.790 testINT[26034:a0f] fontSizeNAme:4240 
2010-11-18 16:56:52.790 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.791 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.791 testINT[26034:a0f] fontSizeNAme:4272 
2010-11-18 16:56:52.791 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.792 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.792 testINT[26034:a0f] fontSizeNAme:4304 
2010-11-18 16:56:52.792 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.793 testINT[26034:a0f] the fontSizeSegmentID is: 32767 
2010-11-18 16:56:52.793 testINT[26034:a0f] fontSizeNAme:4336 
2010-11-18 16:56:52.794 testINT[26034:a0f] val:1879919632 
2010-11-18 16:56:52.794 testINT[26034:a0f] the fontSizeSegmentID is: 32767 

Quelqu'un peut-il me dire pourquoi? pourquoi je jette le @ "22" NString et le un formulaire int renvoie une valeur différente ????? Merci!

Répondre

6

En Objective-C, vous ne pouvez pas simplement comparer un int et NSString* qui contient une représentation sous forme de chaîne d'un nombre entier. Pour convertir entre les deux, vous devez faire

NSString* [email protected]"11"; 
int i=[s intValue]; // i now contains 11 

En outre, la spécification % dans NSLog ne fait pas spécifier comment vous voulez interpréter l'objet. Vous devez spécifier le bon % chose correspondant au type de l'objet. Sinon, il vous montre juste des déchets. Ainsi, les deux

NSLog(@"the current font Value1 is %i", val); 
NSLog(@"the current font Value2 is %i",val2); 

sont illégales, parce que val et val2 sont NSString*. Au lieu de cela, vous devez faire

NSLog(@"the current font Value1 is %@", val); 
NSLog(@"the current font Value2 is %@",val2); 

ou

NSLog(@"the current font Value1 is %i", [val intValue]); 
NSLog(@"the current font Value2 is %i",[val2 intValue]); 

Vous ne pouvez pas comparer deux NSString* s par == soit. Vous devez utiliser [aString isEqualTo:anotherString].

1

Je suis d'accord avec @Yuji, dans l'objectif C, vous ne devez pas essayer de comparer des chaînes avec des nombres entiers. Vous finirez probablement avec un nombre sauvage en cours d'exécution dans un tampon système quelque part. Ou si vous avez une méthode de débogage, vous obtiendrez probablement un out of range exception.

+0

En fait, le programme fera une comparaison entre le 'int' et le pointeur vers votre objet Obj-C, ce qui est tout à fait valide, il vous donnera juste un résultat non-sens. –

+0

Je crois que c'est ce que j'ai dit. –

+0

@Michael Eakins: Quoi que vous croyiez, ce n'est pas ce que vous avez dit. Vous avez dit "vous allez probablement vous retrouver avec un nombre sauvage en cours d'exécution dans un tampon système ... ou ... une exception hors de portée". Aucun de ceux-ci n'arrivera si vous comparez un pointeur à un int. – JeremyP