Pregunta

¿Cómo se declara, establecer las propiedades, sintetizar y aplicar una matriz int del tamaño 5 en Objective C? Estoy escribiendo este código para una aplicación de iPhone. Gracias.

¿Fue útil?

Solución

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;
}

Otros consejos

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, puede escribir sus propias funciones de acceso y hacer que malloc / calloc si llama antes de que la matriz ha sido asignado.

De cualquier manera, tendrá que liberar la matriz en el método dealloc ().

Este es probablemente ingenua y equivocada, ya que sólo estoy en el aumento gradual de Objective C a mí mismo, pero hasta ahora parece estar funcionando para mí.

No use int en este caso si desea utilizar una matriz. Utilice NSNumber y poner 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 de la interfaz y la implementación de sintetizar (no probado por cierto). ¿Qué está tratando de lograr?

buena introducción rápida

Tengo una variable de clase:

NSInteger myInt[5];

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

@property (nonatomic, readonly) NSInteger *myInt;

A continuación, crea el siguiente método de obtención:

-(NSInteger *) myInt {
  return myInt
}

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

Bueno, no sé a ciencia cierta que esto funciona, pero parece. Yo sólo pensé en poner esto por ahí si alguien quiere probarlo.

Haga lo que haga, debe ser consciente de las consecuencias.

una matriz de enteros no se referencia contado. Usted no sabe cuántas personas tienen acceso a ella. Usted no sabe quién debe cancelar la asignación y cuándo. Lo que puede tener fácilmente una propiedad de tipo int *. El colocador tendrá un puntero y almacenarlo en la variable de instancia. El comprador devolverá el contenido de la variable de instancia. Simplemente funciona.

Sin embargo, usted no sabe cuando la matriz se debe asignar o desasignar. Si usted tiene algunos arreglos estáticos (por ejemplo cuatro mesas diferentes que contienen números), no hay problema. Sin embargo, si se crea una matriz de enteros con malloc (), alguien debe liberar () de ella. Así que cuando se va a pasar esto?

Debido a tener que manejar el tiempo de vida de una matriz de forma manual es una basura, me gustaría recomendar que o bien sólo tiene que utilizar un NSArray de NSNumber, o un vistazo a NSPointerArray que pueden ser objeto de abuso para almacenar conjuntos de números enteros con el recuento de referencias, o crear su propia clase como la clase de lotería en una respuesta anterior, sólo un poco más flexible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top