2011-07-12 28 views
10

Si los enteros no se pueden escribir en un diccionario y luego en .plist, pero NSNumbers puede usar NSNumbers en toda la aplicación, en lugar de tener que convertir el almacenamiento de todos los tiempos o cargar un diccionario desde a. plist?NSNumber vs Int

+0

Tenga en cuenta que la asignación de memoria es costosa. Es posible que desee hacer su propia clase similar a NSNumber que sería mutable. –

+0

Prefiere 'NSInteger' sobre' int'. Esto es más portable entre varias versiones de OS X. – mouviciel

+0

Usted puede simplemente sustituir un 'NSNumber' (un objeto) por un' int' (un "valor escalar").Sería increíblemente incómodo mantener cada cantidad numérica en un 'NSNumber' y convertir de/a para cada cálculo. Usar 'NSInteger' en lugar de' int', por otro lado, es algo razonable de hacer. –

Respuesta

8

Como una generalización: Sólo se adhieren con los tipos de POD hasta que necesidad usar una representación basada en objetos, como NSNumber. El rendimiento es mucho mejor con los POD, pero en algunos casos necesitará NSNumber.

En algunos casos, puede tener sentido utilizar NSNumber lugar - esto es por lo general cuando se reutilización un NSNumber menudo - esto es para evitar hacer una tonelada de duplicados NSNumber s. Tales ocurrencias son prácticas raras veces más allá de la serialización y las interfaces de objc genéricas (enlaces, transformadores, diccionarios).


actualización/Detalles: El tiempo de ejecución será ObjC en algunos casos, en algunas arquitecturas, y en algunas versiones del sistema operativo sustituir un etiquetada puntero que representa NSNumber s de tipo específico y el dominio. Aunque la representación interna ha cambiado desde que se escribió originalmente hace unos años, aquí hay una buena introducción al tema: http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in. Donde esto se puede usar, le ahorra operaciones lentas como asignaciones, bloqueo y operaciones de conteo. Sin embargo, los punteros etiquetados son incapaces de representar cada número e introducen sobrecarga, por lo que aún debería favorecer las construcciones internas básicas por encima de NSNumber de forma predeterminada. Los punteros etiquetados son una gran optimización cuando corresponde, pero están lejos de competir con los edificios cuando solo necesitas un número .

+1

Lo bueno es que KVC admite el autoboxing, es decir, la conversión entre tipos escalares y NSNumber, por lo que no es necesario utilizar NSNumber en las propiedades. – DrMickeyLauer

+0

Es posible que desee revisar esto teniendo en cuenta las implicaciones de los dispositivos de 64 bits. – user

+2

@ actualización de usuario agregada – justin

0

NSNumber es un objeto heredado del objeto envoltorio NSValue.

int no es el objeto.

si utiliza NSNumber puede obtener más y más funciones para utilizar con ellas.

http://developer..com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

NSNumber es una clase que te ayuda a almacenar los tipos numéricos como objeto. Tiene métodos para convertir entre diferentes tipos y métodos para recuperar una representación de cadena de su valor numérico. Si usa un día variable del tipo NSNumber * como lo hizo en su ejemplo, no está modificando el valor del día sino su dirección de memoria.

0

Todo depende de su necesidad. Pero, si la API requiere que use int, debe usar int. Le pide que use NSNumber debe usar NSNumber.

Por ejemplo, si está utilizando un UISegmentedControl y desea seleccionar un segmento, entonces,

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here 
// or 
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];