2013-02-14 34 views
5

Ora che abbiamo letterali NSNumber con supporto del compilatore in Objective-C, esiste un modo preferito per confrontare un NSNumber con un valore intero noto?NSNumero valore primitivo uguaglianza vs isEqualToNumber con Obj-C Literals

Il vecchio modo è [myNumber integerValue] == 5

Ora possiamo fare [myNumber isEqualToNumber:@5] o addirittura [myNumber isEqualToNumber:@(someVariable)].

Esiste un vantaggio per il metodo isEqualToNumber: oppure dovremmo restare con valore intero a meno che il valore da confrontare non sia già un NSNumber?

Un vantaggio che posso vedere è se alcune modifiche di variabile da un NSInteger a un CGFloat, non saranno necessarie modifiche al codice per il nuovo modo.

risposta

10

Il nuovo modo è davvero una nuova sintassi intorno al vecchio

[myNumber isEqualToNumber:[NSNumber numberWithInt:5]] 

che richiede una chiamata extra di numberWithInt:; essenzialmente, stiamo confrontando una soluzione con una singola spedizione e zero allocazioni a una soluzione con due dispacci, e possibilmente un'allocazione/deallocazione.

Se si effettua questo confronto al di fuori di un circuito chiuso, non importa. Ma se lo fai in un loop davvero stretto, forse mentre disegni qualcosa, potresti vedere un rallentamento. È per questo che mi piacerebbe rimanere con il vecchio metodo di

[myNumber integerValue] == 5 
+0

l'autoboxing/unboxing arriverà mai all'obiettivo C? –

+1

@AmoghTalpallikar No, ma la cosa più vicina è qui: '[myNumber isEqualToNumber: @ 5]' – dasblinkenlight

+0

sarà == controllare i lavori per NSNumbers se rappresentano lo stesso numero o bool? myNumber == @ 5 o stato == @YES –

3

Il "vecchio modo" è una chiamata al metodo più l'operatore di confronto contro due tipi di base.

Il "nuovo modo" è una chiamata di metodo più una creazione di oggetto extra.

Quindi la vecchia via è più efficiente. Ma a meno che ciò non avvenga in un ciclo ad alte prestazioni (o qualcosa di simile), la differenza è trascurabile.

Come hai affermato, il nuovo modo può essere più flessibile in relazione al tipo specifico di numero.

Personalmente, sceglierei il modulo che si trova più leggibile e gestibile a meno che non si abbia un problema di prestazioni chiare e specifiche da affrontare.

Sebbene si possa avere un motivo specifico per confrontare un valore float o un valore intero indipendentemente dal valore originale. In questo caso, la vecchia maniera è migliore perché il tipo di confronto è chiaro.

2

Risposta breve:[myNumber integerValue] == 5 è ancora il migliore.

lunghi (ma probabilmente non dovrebbe cura) risposta: partire iOS 5, "alcuni" NSNumbers sono realizzati tramite tag puntatori (quick google). Ciò significa che finché il valore NSNumber si adatta a 24 bit (per i processori ARM a 32 bit di iPhone/iPad), non verrà creata alcuna istanza effettiva. Quindi, in teoria, se sei sicuro che i valori non supereranno mai i 24 bit, puoi effettivamente fare solo myNumber == @5.

Quale non è davvero un buon consiglio. Attenersi a [myNumber integerValue] == 5. Puntatori con tag sono lì per aiutare il runtime, non i programmatori.