2011-03-24 22 views
5

Pasé algún tiempo hoy persiguiendo dos errores, y terminé solucionando los dos con la misma solución.Comparar NSNumber con NSInteger

Ahora que tengo la solución, esperaba aclarar un poco.

Estoy comparando un atributo de Datos principales (Número entero/NSNumber) con un Entero (ABPropertyID & ABMultiValueIdentifier).

El error estaba en esta comparación, y por extraño que parezca, solo apareció después de que había matado la aplicación (desde la bandeja de fondo), la volvió a abrir y ejecutaba el mismo proceso que incluía la comparación. De todas formas ...

Esto es lo que dejó de funcionar después de un reinicio:

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

Y éstas son las dos soluciones, que hasta el momento, están trabajando perfectamente:

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

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

Para mí, todos parecen idénticos. Siempre estoy convirtiendo el NSNumber en un integerValue o convirtiendo el entero en un NSNumber.

¿Alguna idea?

Respuesta

11

No utilice == para comparar NSNumber s. La mayoría de las veces estará comparando dos objetos distintos, por lo que la comparación no se evaluará como verdadera. Si nos fijamos en su condición, observe que está comparando su propiedad con un objeto nuevo NSNumber.

Dado que NSInteger es un envoltorio de cacao para ciertos tipos de valor, la comparación de NSInteger s con == funciona bien.

La implementación de isEqualToNumber: probablemente tome los tipos de valores empaquetados y los compare también.

+1

Eso tiene sentido.Sin embargo, una cosa que era extraña, y mencioné brevemente en mi publicación, es que la comparación estaba funcionando cuando ejecuté mi aplicación por primera vez. Fue solo después de que maté mi aplicación, la volví a abrir y ejecuté la aplicación a través de la comparación, que empecé a ver resultados inesperados. Sin saber nada sobre mi aplicación o ver ningún código, ¿podría adivinar por qué estaba ocurriendo esto? – djibouti33

+0

@ djibouti33: No es una pista ... (y al decir esto estoy señalando su imprevisibilidad también :) – BoltClock

2

Como usted ha dicho, ambas soluciones están trabajando ...

yo preferiría la primera, ya que parece más fácil de leer, en mi humilde opinión ... También puede ser con más prestaciones, como usted está comparando números enteros, después de haber convertido un NSNumber a un int.

En el segundo, convertir un int a un objeto, a continuación, se comparan los dos objetos ... Así que esa es una segunda llamada al método, que no tiene en el primer caso ...

Espero que esto ayude ...:)

1

netWorkingButtonsIndexes es la matriz que contiene objetos y LinkedIn es un número con int tipo de datos.

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

Al utilizar el método de isEqual podemos comparar objetos con cualquier RTYPE datos.