2009-05-27 13 views
9

Soy nuevo en Objective-C y Cocoa. He leído que se prefieren NSInteger y NSNumber cuando se trabaja con enteros simples porque son las versiones "aptas para plataformas" de los tipos numéricos primitivos (y en el caso de NSNumber, envuelto en un objeto). Entonces, necesito un contador en mi clase que se incrementa cuando se dispara un NSTimer. En un foro de Apple, encontré un grupo de personas que recomendaban a alguien en una situación similar que declararan un puntero NSNumber en el encabezado, lo inicializaran con numberWithInt :, y luego cada vez que necesita incrementarlo, asígnelo a un objeto nuevo (algo así como counter = [NSNumber numberWithInt:[counter intValue]+1];). Esto me parece excesivo. Si todo lo que necesito es un contador int (y, por cierto, lo estoy restableciendo a 0 después de que llegue a 15 para que el tamaño no sea un problema), ¿no puedo salirse con la suya simplemente usando un int y no tener que asignar un nuevo objeto con cada iteración del ciclo de mi temporizador?¿Es NSNumber exagerado para un contador de nivel de instancia?

Y si es así, ¿cómo puedo hacer un tipo primitivo disponible en toda mi clase. Sé que con tipos de objetos, lo declaro en mi interfaz y uso @property y @synthesize ... ¿Cuál es el equivalente (si existe) cuando trabajo con primitivos?

+0

A su segunda pregunta: Es lo mismo, simplemente use @property y @synthesize. –

Respuesta

15

Usando NSNumber para un simple contador tiene un aspecto un poco de más de matar. Se puede declarar como miembros de la clase NSInteger y simplemente actualizarlos utilizando ++ o + =

por ejemplo:

@interface YourViewController : UIViewController { 
NSInteger counter;  
} 

@property (nonatomic,assign) NSInteger counter; 

El @synthesize es simplemente:

@synthesize counter 

y se puede aumentar ya sea por :

self.counter += 1; 

o

counter ++; 

la tarde impedirá cualquier observador de ser informado, por tanto, podría no ser preferible.

+0

No sabía que + = trabajaba en propiedades ... gracias a @gs –

9

NSNumber es una representación de objeto de un número. Lo uso al almacenar números en una clase de colección porque solo pueden contener punteros a objetos.

Así que en tu ejemplo, que necesita un contador, que probablemente es una exageración.

NSInteger es simplemente un número entero que es typedefed para ser seguro para los programas de 32 y 64 bits, y es recomendado por Apple para su uso en lugar de int. No es un objeto Esto es probablemente lo que necesita para un contador (en realidad NSUInteger, que es un unsigned int) podría ser mejor.

En cuanto a hacer primitivas disponibles a través de su clase - bien, si se declara en la cabecera como Ivar, que está disponible en toda la clase de todos modos. @property y @synthesize son solo formas de Objective-C 2.0 de declarar esto como propiedades que se pueden ver (y quizás cambiar) fuera de su clase de manera compatible con KVC/KVO. Los tipos primitivos se pueden usar como propiedades usando la misma sintaxis @property y @synthesize.

4

utilizo NSInteger (no int, para ser más portátil), y se envuelve en una NSNumber si tengo que añadir a una colección (tales como NSMutableDictionary al guardar el estado de salir de la aplicación).

1

Estoy de acuerdo con su instinto, usar un objeto para un contador simple suena como excesivo y agregará un número innecesario de llamadas de despacho de mensajes simplemente para incrementar un contador. Para un contador que no necesita almacenarse en una colección ni manipularse como un objeto, adhiérase a los tipos de escalares C.

Declarar un escalar como una variable de instancia de su clase, simplemente declarar que en el archivo de cabecera:

@interface MyClass: NSObject{ 
    int counter; 
} 

@end 
0

Si hace necesidad de incrementar un NSNumber (como para una propiedad NSManagedObject) I encontrado esta categoría ayudó:

@interface NSNumber (Incrementer) 
- (NSNumber *)increment; 
@end 

@implementation NSNumber (Incrementer) 
- (NSNumber *)increment { 
    return [NSNumber numberWithInt:[self intValue]+1]; 
} 
@end 

por lo que puede simplificar las declaraciones de incremento a:

counter = [counter increment]; 
Cuestiones relacionadas