Domanda

Ho trascorso un po 'di tempo oggi che inseguono due bug e ha finito per sistemare entrambi usando la stessa soluzione.

Ora che ho la soluzione, speravo di ottenere una chiarezza dietro di esso.

Sto confrontando un attributo dai dati principali (numero intero 16 / nsnumber) con un intero (AbpropertyId & AbmultivaReidIdentifier).

Il bug era in questo confronto, e abbastanza stranamente, si è mostrato solo dopo aver ucciso l'app (dal vassoio sfondo), lo riaperta e attraversa lo stesso processo che includeva il confronto.Comunque ...

Questo è ciò che ha smesso di funzionare dopo un riavvio:

if (myNumber.aProperty == [NSNUmber numberWithInt:anInteger]) { /* do stuff here */ }

E queste sono le due soluzioni, che finora stanno funzionando perfettamente:

if ([myNumber.aProperty integerValue] == anInteger) {/* do stuff here */ }

if ([myNumber.aProperty isEqualToNumber:[NSNumber numberWithInt:anInteger]]) { /* do stuff here */ }

Per me, sembrano tutti identici.Sto sempre convertendo il numero NSNumber in un Integerualue o convertendo il numero intero su un numero NSN.

Qualche idea?

È stato utile?

Soluzione

Non utilizzare == per confrontare NSNumbers.La maggior parte delle volte confronterai due oggetti distinti, quindi il confronto non restituirà vero.Se osservi la tua condizione if, nota che stai confrontando in particolare la tua proprietà con un oggetto NSNumber nuovissimo .

Poiché NSInteger è un wrapper Cocoa per determinati tipi di valore, il confronto tra NSIntegers e == funziona correttamente.

L'implementazione di isEqualToNumber: probabilmente prende i tipi di valore inclusi e li confronta anche.

Altri suggerimenti

Come hai detto, entrambe le soluzioni funzionano ...

Preferirei il primo, come sembra più leggibile, imho ... Potrebbe anche essere più performante, poiché si confronta i numeri interi, dopo aver convertito un numero NSNumero su un INT.

Nel secondo, converti un int per un oggetto, quindi confronti i due oggetti ... Quindi questa è una seconda chiamata del metodo, che non hai nel primo caso ...

Spero che questo aiuti ... :)

netWorkingButtonsIndexes è l'array che contiene oggetti e LinkedIn è un numero con tipo di dati int.

[[netWorkingButtonsIndexes objectAtIndex:buttonIndex] isEqual:[NSNumber numberWithInteger:LinkedIn]] 

Utilizzando il metodo isEqual possiamo confrontare oggetti con qualsiasi tipo di dato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top