2010-08-08 5 views
2

j'ai les suivantes deux morceaux de code qui je pense devrait être identiqueNSArray si déclaration comportement étrange

int temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state]; 
if (temp > 0) 
{ 
    NSLog(@"TEST: %d",temp); 
} 

if ([[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state] > 0) 
{ 
    NSLog(@"TEST: %d",temp); 
} 
état

est juste un int dans les objets du tableau avec accesseur comme:

@property (assign)int state; 

mais lorsque l'état est négatif, la première version fonctionne (pas de sortie), mais la deuxième version sort (par exemple) "TEST: -4" (?!)

est-il une raison évidente pourquoi ils pourraient être dif ferent?

+0

Si le fichier d'en-tête avec l'état n'est pas importé, objc suppose qu'il renvoie l'ID. Avez-vous vérifié que vous incluez les bons en-têtes? – neoneye

Répondre

2

Depuis -objectAtIndex: renvoie un id, le compilateur ne sera pas en mesure de savoir ce que -state doit renvoyer. Si vous n'avez pas importé l'en-tête qui déclare state en premier ou si la propriété state a une déclaration ambiguë (une autre classe a déclaré @property(retain) id stateavant que votre classe soit importée), alors le compilateur peut déduire un mauvais type pour -state.

Si elle infère id, par exemple, que tous les pointeurs sont non négatifs, -4 seront implicitement considérés comme 0xFFFFFFFC, ainsi la> 0 état passe.

Mais pour le code 1, vous avez indiqué que temp est un int, même si la valeur de retour de l'appel est 0xFFFFFFFC, il sera jeté à une valeur signée (-4), d'où la condition échoue.

L'approche la plus sûre est de préciser le type de -objectAtIndex:, à savoir

Foo* obj = [[myArray objectAtIndex:iIndex] objectAtIndex:jIndex]; 
if (obj.state > 0) { 
... 
0

Je je comprends bien, et les deux si ce sont pas dans la même méthode, la seconde imprime une variable non affectée. le correctif doit être comme suit:

if ((temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state]) > 0) 
{ 
    NSLog(@"TEST: %d",temp); 
}