2009-05-26 6 views
7

¿Cómo declaras, configuras propiedades, sintetizas e implementas una matriz int de tamaño 5 en el Objetivo C? Estoy escribiendo este código para una aplicación de iPhone. Gracias.Declarar, Propiedades, Sintetizar e Implementar matriz int [] en el Objetivo C

+1

si no puede pasar de este paso, le recomiendo encarecidamente que REALMENTE DEBE obtener el libro de Aaron Hillegas sobre la programación de Cocoa. – KevinDTimm

+0

La cuestión es que sé que podría salirse con la suya con un NSMutableArray o simplemente tengo 5 entradas independientes, ya que el tamaño se fija en 5, pero tener una serie de entradas sería mucho más elegante. También me gustaría saber cómo para el futuro. He escrito en varios otros idiomas, pero parece que no puedo encontrar una respuesta definitiva sobre cómo hacerlo en el objetivo c para el iphone. –

Respuesta

9

Creo que lo "Cacao-y" hacer es ocultar la matriz int incluso si se utiliza internamente. Algo así como:

@interface Lottery : NSObject { 
    int numbers[5]; 
} 

- (int)numberAtIndex:(int)index; 
- (void)setNumber:(int)number atIndex:(int)index; 
@end 

@implementation Lottery 

- (int)numberAtIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    return numbers[index]; 
} 

- (void)setNumber:(int)number atIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    numbers[index] = number; 
} 
+0

Eso es exagerado. Use una matriz C –

+0

¿Cómo haría eso? Creo que eso es lo que he querido hacer originalmente con la matriz int. –

+0

Eso * es * usando una matriz C, Roger. Pero elimina todas las molestias de memcpy y detalles de bajo nivel que realmente no pertenecen a una interfaz Cocoa. – Chuck

0

No debe usar int en este caso si desea usar una matriz. Use NSNumber y ponga esos 5 NSNumbers en un NSMutableArray.

@interface testClass: NSObject { 
    NSMutableArray* numbers; 
} 
@property (nonatomic, retain) NSMutableArray* numbers; 
-(id)initWithValue:(NSNumber *)initialValue; 
@end 


@implementation testClass 
@synthesize numbers; 
-(id)initWithValue:(NSNumber *)initialValue { 
    numbers = [[NSMutableArray alloc] initWithCapacity:5]; 
    [numbers addObject:initialValue]; 
    return self; 
} 
@end 

Es el código para la interfaz y la implementación con sintetizar (no probado BTW). ¿Qué está tratando de lograr?

Good quick intro

+0

Gracias por la respuesta rápida. La razón por la que quería usar una matriz de entradas es que estoy tratando de almacenar 5 números aleatorios/únicos entre 1: 1000 y quería una estructura fácil para verificar si cada int posterior es único. Parece que esto será mucho más difícil usando NSMutableArray. ¿Que sugieres? –

+0

Ahh, entonces tal vez en un bucle for verifique si intArray [i] == intArray [i-1] falla? Ciertamente hay más sobrecarga usando los objetos objc, puede ser mejor usar int []. ¿Puedes mantener la matriz de enteros como una variable local en el método en el que estás generando los números? ¿O necesita que sea una propiedad accesible de la clase? – ryanday

+0

Quiero que sea una variable de instancia porque la clase es parte del modelo en un MVC. Sin embargo, ¿la sobrecarga adicional sería significativa si el tamaño es solo 5? –

0

tengo una variable de clase:

NSInteger myInt[5]; 

Así que podría utilizar la normalidad myInt [1] = 0 sintaxis en mi código, he creado una propiedad que devuelve un puntero entero :

@property (nonatomic, readonly) NSInteger *myInt; 

creó entonces el siguiente método de obtención:

-(NSInteger *) myInt { 
    return myInt 
} 

Ahora puedo usar algo como class.myInt [1] = 0;

Bueno, no estoy seguro de que esto funcione, pero parece que sí. Solo pensé en poner esto por ahí si alguien más quiere probarlo.

2

Aquí hay algo que probar. En el archivo .h:

@property int* myIntArray; 

A continuación, en el archivo .m:

@synthesize myIntArray; 

Si utiliza @synthesize, que necesitará para malloc/calloc la matriz a sí mismo, probablemente durante init ()

Como alternativa, podría escribir sus propias funciones de acceso y tenerlas malloc/calloc si se llama antes de que se haya asignado la matriz.

De cualquier forma, deseará liberar la matriz en el método dealloc().

Esto es probablemente ingenuo y erróneo, ya que estoy aumentando el Objective C, pero hasta ahora parece estar funcionando para mí.

+0

+1 ¡Excelente primera respuesta! – bakoyaro

0

Hagas lo que hagas, debes ser consciente de las consecuencias.

Una matriz de enteros no es referencia contada. No sabes a cuántas personas acceden. No sabes quién debería desasignarlo ni cuándo. Por lo tanto, puede tener fácilmente una propiedad de tipo int *. El colocador tomará un puntero y lo almacenará en la variable de instancia. El getter devolverá el contenido de la variable de instancia. Simplemente funciona.

SIN EMBARGO usted no sabe cuando la matriz debe ser asignada o desasignada. Si tiene algunas matrices estáticas (por ejemplo, cuatro tablas diferentes que contienen números), no hay problema.Pero si creas una matriz de enteros con malloc(), alguien debería liberarlo(). Entonces, ¿cuándo va a suceder esto?

Como tener que manejar la vida útil de una matriz manualmente es una basura, le recomendaría que simplemente use una NSArray de NSNumber o mire NSPointerArray, que puede utilizarse para almacenar matrices de enteros con recuento de referencias, o usted crea su propia clase como la clase Lotería en una respuesta anterior, solo un poco más flexible.

Cuestiones relacionadas