tipo de conversión en objective-c, (NSInteger) VS. valor integer

No entiendo muy bien la diferencia entre (NSInteger)aNumberValue y [aNumberValue integerValue] , luego hago algunas testings. Por ejemplo, aquí hay una respuesta de datos del server:

introduzca la descripción de la imagen aquí

Puedes ver que es un int, pero el valor es retenido por NSNumber. Recibo los datos escribiendo NSInteger count = (NSInteger) dic[@"count"]; , y en el área de debugging de Xcode, vio esto:

introduzca la descripción de la imagen aquí

es realmente un valor extraño, pero cuando ejecuto po count y vi esto:

introduzca la descripción de la imagen aquí

De todos modos, el valor es correcto, pero otra cosa extraña es:

introduzca la descripción de la imagen aquí

¡el número 2 no es less de 100!

Luego pruebo NSInteger a = [dic[@"count"] integerValue] y vi el valor normal en el área de debugging Xcode:

introduzca la descripción de la imagen aquí

y:

introduzca la descripción de la imagen aquí

Entonces, estoy un poco confundido, ¿cuál es la deferencia entre (NSInteger)aNumberValue y [aNumberValue integerValue] ?

NSNumber es una class; NSInteger es solo un typedef de long , que es un tipo primitivo.

dic[@"count"] es un puntero, lo que significa que dic[@"count"] contiene una dirección que apunta a la instancia NSNumber . NSNumber tiene un método llamado integerValue que devuelve un NSInteger como el valor subyacente que representa la instancia NSNumber . Por lo tanto, puede concluir que [dic[@"count"] integerValue] le proporciona long , y así recupera el valor de NSNumber .

No recupera el valor de NSNumber al convertirlo en NSInteger . Eso es porque dic[@"count"] , como dije, es un puntero. Entonces escribiendo

 NSInteger count = (NSInteger) dic[@"count"]; 

en realidad está lanzando el puntero mismo a un NSInteger , que no tiene nada que ver con el valor real representado. El valor 402008592 que ve es solo una representación decimal del valor del puntero, que es una dirección.

El command po se utiliza para imprimir objects , por lo que lldb realmente intentará imprimir el object en la dirección de count . Es por eso que obtienes 2 nuevo usando po . Puedes probar p count y obtendrás 402008592 .

Acerca de po count < 100 : la expresión (count < 100) se evalúa primero; dado que count es realmente solo un NSInteger de 402008592 , se evaluará como false .

El problema raíz es que las classs de colección Objective-C solo pueden almacenar objects Objective-C, no types primitivos como float , int o NSInteger .

Por NSNumber tanto, NSNumber proporciona un mecanismo para almacenar numbers y booleans en forma de object.

El valor 402008592 parece a una dirección, por lo que probablemente sea un object NSNumber que contenga un valor NSInteger .

No se confunda con el prefijo NS de NSInteger y NSUInteger ; siguen siendo types primitivos y no objects como NSNumber .