Pergunta

Como você declarar, propriedades definidas, sintetizar e implementar um array int de tamanho 5 em Objective C? Eu estou escrevendo este código para um aplicativo para iPhone. Obrigado.

Foi útil?

Solução

Eu acho que a coisa "Cacau-y" a fazer é esconder a matriz int mesmo se você usá-lo internamente. Algo 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;
}

Outras dicas

O Aqui algo para tentar. No arquivo .h:

@property int* myIntArray;

Em seguida, no arquivo .m:

@synthesize myIntArray;

Se você usar @synthesize, você vai precisar para malloc / calloc a matriz mesmo, provavelmente durante init ().

Como alternativa, você poderia escrever suas próprias funções de acesso e tê-los malloc / calloc se chamado antes de a matriz foi alocado.

De qualquer maneira, você vai querer libertar a matriz no método dealloc ().

Este é provavelmente ingênuo e errado, como eu estou apenas acelerando em Objective C mim mesmo, mas até agora parece estar a trabalhar para mim.

Você não deve usar int neste caso, se você quiser usar uma matriz. Use NSNumber e colocar esses 5 NSNumbers em um 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

é o código para a interface e implementação com sintetizar (não testado BTW). O que você está tentando realizar?

Boa rápida introdução

Eu tenho uma variável de classe:

NSInteger myInt[5];

Assim que eu poderia usar o myInt normal [1] = 0 sintaxe no meu código, eu criei uma propriedade que retorna um ponteiro de inteiro:

@property (nonatomic, readonly) NSInteger *myInt;

Em seguida, criou o seguinte método getter:

-(NSInteger *) myInt {
  return myInt
}

Agora eu posso usar algo como class.myInt [1] = 0;

Bem, eu não sei com certeza isso funciona, mas parece. Eu apenas pensei que eu ia colocar isso lá fora, se alguém quer experimentá-lo.

Faça o que fizer, você deve estar ciente das conseqüências.

Uma matriz de inteiros não é referência contada. Você não sabe quantas pessoas estão acessando. Você não sabe quem deve desalocar e quando. Assim, você pode facilmente ter uma propriedade do tipo int *. O distribuidor terá um ponteiro e armazená-lo para a variável de instância. O absorvente vai retornar o conteúdo da variável de instância. Ele simplesmente funciona.

No entanto, você não sabe quando a matriz deve ser alocado ou desalocado. Se você tem algumas matrizes estáticas (por exemplo, quatro tabelas diferentes contendo números), não há problema. Mas se você criar um array de inteiros com malloc (), alguém deve liberar ()-lo. Então, quando é que isto vai acontecer?

Porque ter de lidar com a vida útil de uma matriz manualmente é lixo, eu recomendo que você quer apenas usar um NSArray de NSNumber, ou você olhar para NSPointerArray que pode ser abusado para armazenar matrizes de inteiros com contagem de referência, ou você criar sua própria classe como a classe Lottery em uma resposta anterior, apenas um pouco mais flexível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top