Pregunta

Soy nuevo en Objective-C y Cocoa. He leído que NSInteger y NSNumber se prefieren cuando se trabaja con números enteros simples porque son las versiones "plataforma de seguros" de los tipos numéricos primitivos (y en el caso de NSNumber, envueltos en un objeto). Por lo tanto, necesito un contador en mi clase que obtiene incrementa cuando un NSTimer incendios. En un foro de Apple me encontré con un grupo de personas todos los que recomiendan a alguien en una situación similar que declare un puntero NSNumber en la cabecera, inicializarlo con numberWithInt :, y luego cada vez que necesita ser incrementado hacerlo mediante la asignación de un nuevo objeto (algo así como counter = [NSNumber numberWithInt:[counter intValue]+1];). Esto parece una exageración para mí. Si todo lo que necesito es un contador int (y por cierto, estoy reiniciarlo de nuevo a 0 después de haber caído 15 por lo que el tamaño no es un problema), no puedo salirse con sólo usar un int y no tener que asignar una nuevo objeto con cada iteración del bucle de mi contador de tiempo?

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

¿Fue útil?

Solución

El uso de 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 puede ser incrementado ya sea por:

self.counter += 1;

o

counter ++;

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

Otros consejos

NSNumber es una representación de objeto de un número. Yo lo uso al almacenar números en una clase de colección, ya que sólo pueden contener punteros a objetos.

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

NSInteger es simplemente un entero que se typedefed ser seguro para 32 y 64 bits programas, 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 la toma de 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 sólo de Objective-C 2.0 formas de declarar estos como propiedades que se pueden ver (y tal vez modificados) fuera de la clase de una manera compatible con KVC / MVA. Los tipos primitivos se pueden utilizar como propiedades utilizando la misma sintaxis @property y @synthesize.

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

Estoy de acuerdo con su instinto, utilizando un objeto para un simple contador suena como una exageración y añadirá un número innecesario de las llamadas de envío de mensajes por el simple hecho aumentar un contador. Para un contador que no necesitan ser almacenados en una colección o manipulado como un objeto, se adhieren con los tipos C escalares.

Para 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

Si DO Hay que incrementar un NSNumber (como para una propiedad NSManagedObject) encontré 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];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top