2012-12-09 9 views
6

Entrambi i metodi restituiscono risultati uguali. Naturalmente, -[NSObject isEqual:] non confronta i puntatori degli oggetti, ma controlla in qualche modo i campi interni o qualsiasi altra cosa. Quindi, qual è il punto di utilizzare esattamente -[NSNumber isEqualToNumber:] per confrontare due NSNumber s?- [NSObject isEqual:] e - [NSNumber isEqualToNumber:]: qual è la differenza?

+0

'-isEqual:' controlla gli hash degli oggetti (a meno che non sia sovrascritto). – CodaFi

+0

@CodaFi Sembra che in 'NSNumber' sia sovrascritto (perché due' NSNumber's con uguali hash non sono uguali per 'isEqual'). Questa è la domanda. – efpies

risposta

8

Dal docs:

Due oggetti NSNumber sono considerati uguali se hanno lo stesso ID valori o se hanno valori equivalenti (come determinato dal paragonare: metodo). Questo metodo è più efficiente del confronto: se si conoscono i due oggetti sono numeri.

Quindi gestisce gli equivoci e il confronto dei numeri.

+1

Cosa significano dopo "valori equivalenti"? '@ 1' e' @ 1.0' sono ovviamente equivalenti, ma esiste un esempio di valori quando 'isEqualToNumber' stesso * deve * essere usato? Guarda i miei test anche per '@ 1' e' @ 1.0000000001' (che hanno anche gli stessi hash e i diversi puntatori) 'isEqual' e' isEqualToNumber' hanno gli stessi risultati. – efpies

+0

Se il confronto: restituisce NSOrderedSame, sono valori equivalenti. Indoverei che isEqual è delegato a isEqualToNumber se non sono gli stessi oggetti e sono entrambi NSNumbers. –

+5

@TerryWilcox Hai ragione. Vedere la riga 416 di [NSNumber.m] (https://code.google.com/p/cocotron/source/browse/Foundation/NSNumber/NSNumber.m). –

-2

-[NSObject isEqual:] controlla se i due oggetti hanno l'indirizzo del puntatore e l'hash mentre -[NSNumber isEqualToNumber:] controlla se i valori sono gli stessi.

NSNumber s che sono uguali hanno lo stesso indirizzo puntatore.

+0

Quindi mi aspetto che '@ 1' e' @ 1.0' abbiano gli stessi hash. No? Ma in realtà lo fanno. – efpies

+0

NSNumber non conserva il tipo. NSNumber da 0 a 12 sono memorizzati nella cache, quindi entrambi sono probabilmente lo stesso oggetto. –

+1

L'implementazione predefinita di isEqual: confronta i due oggetti id, non gli hash. Due oggetti non uguali possono avere lo stesso hash. –

2

Sono essenzialmente identici, sebbene isEqual debba eseguire un controllo di tipo sulla classe dell'oggetto passato. IsEqualToNumber esegue il controllo di tipo in fase di compilazione, che è preferibile quando possibile.