Para responder mejor a su pregunta. Si nos fijamos en isEqualToNumber la documentation for NSNumber 's: La función se dará cuenta de la siguiente línea,
objetos
Dos NSNumber se consideran iguales si tienen los mismos Identificación valores o si tienen valores equivalentes
es importante que comprenda esto. En su código que está preguntando es mi número NSNumber "número" igual a "valor", no está preguntando ¿el valor numérico almacenado en mi objeto NSNumber "número" es igual al valor numérico almacenado en mi objeto NSNumber "valor".
La última línea de código que ha escrito muestra que, de hecho, los valores numéricos de su NSNumber son, de hecho, iguales.
NSLog(@"%d", [number unsignedLongLongValue] == value); //1
Así que el almacenamiento y la recuperación de los valores correctamente, usted debe utilizar el método de comparación == con objetos NSNumber almacena valores numéricos (es decir intValue == intValue, unsignedLongLongValue == unsignedLongLongValue) y no la comparación de sus objetos de id juntos.
En cuanto a esta línea de código
NSLog(@"Current Number:%@", number); // -2538698204676668398, weird
Esto no es raro, esto es perfectamente normal, como usted ha dicho NSLog para imprimir una representación NSObject de 'número'. No estoy 100% seguro pero creo que la función - (NSString *) description
de NSNumber tiene como valor predeterminado devolver un valor int sin signo para el valor numérico que contiene. Es por eso que está obteniendo el gran número negativo devuelto. Es posible que desee ver en función de NSNumber - (NSString *)descriptionWithLocale:(id)aLocale
a imprimir los datos de una forma más lógica para para usted, o usted podría utilizar
NSLog(@"Current Number:%llu", [number unsignedLongLongValue]);
que le dará la respuesta correcta.
EDIT:
Además de esto, después de mirar en la edición de lo que está sucediendo es que en el recuerdo de su objeto NSNumber de UserDefaults es el tipo de número original no está siendo preservado (esta información se pone de relieve en la documentación para NSNumber en la sección de información general)
(Tenga en cuenta que los objetos numéricos no necesariamente conservan el tipo que se crean con.)
Se puede ver esto por sí mismo si se registra el siguiente después de recuperar el "número" de valores predeterminados del usuario (añadir esto al final del código que tiene en su pregunta) y echar un vistazo a los valores de codificación que se muestran here
NSLog(@"%s", [number objCType]); //This will log out q
NSLog(@"%s", [[NSNumber numberWithUnsignedLongLong:value] objCType]); //this will log out Q
La diferencia entre Q y Q es que Q es un valor sin signo ... de ahí que tenga problemas con la función isEqualToNumber: los tipos de números son diferentes. Si está tan inactivo al usar la función iSEqualToNumber: para comparar valores, entonces podría implementar esto para recuperar su valor de NSUserDefaults.
NSNumber *number = [NSNumber numberWithUnsignedLongLong:[[NSUserDefaults standardUserDefaults] objectForKey:NumberKey] unsignedLongLongValue]];
Se podría contemplar la utilización de la NSNumber comparar: función para ver si el valor devuelto es NSOrderedSame sin embargo, esto no va a funcionar para comparar sin firmar vs valores con signo del mismo tipo por lo que en su situación que haría uso de los anteriores como recuperar los datos de NSUserDefaults está eliminando la "firma" de su número.
Estoy de acuerdo con usted. Sin embargo, "Dos objetos NSNumber se consideran iguales si tienen los mismos valores de id o si tienen valores equivalentes" significa que puedo depender del isEqualToNumber: para determinar el valor de dos objetos NSNumber, pero el resultado de mi código revela que no puede depender de este método Tengo que deducir por mí mismo que el tipo de valor, y usar el método "XXValue" y "==" para comparar dos objetos NSNumber, lo cual no es conveniente, porque el método isqual: se usa en muchos otros objetos como NSArray, NSDictionary. – Swordsfrog
@Swordsfrog después de analizar esto un poco más la naturaleza de sus problemas también se relaciona con una respuesta más adelante. Editaré mi respuesta original para demostrar esto también. –
Gracias, eso acaba de resolver mi problema. – Swordsfrog