Pergunta

Eu sou novo para Objective-C e Cocoa. Eu li que NSInteger e NSNumber são preferidos quando se trabalha com números inteiros simples, porque eles são as versões "plataforma segura" dos tipos numéricos primitivos (e no caso de NSNumber, envolto em um objeto). Então, eu preciso de um contador na minha classe que é incrementado quando uma incêndios NSTimer. Em um fórum da Apple eu encontrei um grupo de pessoas de recomendar a alguém em uma situação semelhante que deve declarar um ponteiro NSNumber no cabeçalho, inicialize-o com numberWithInt :, e então cada vez que precisa ser incrementado fazê-lo, atribuindo-o para um novo objeto (algo como counter = [NSNumber numberWithInt:[counter intValue]+1];). Este parece ser um exagero para mim. Se tudo necessidade I é um contador int (e btw, estou redefini-lo de volta para 0 depois que ela atinge 15 para que o tamanho não é um problema), não posso fugir com apenas usando um int e não ter que alocar um novo objeto com cada iteração do loop de do meu timer?

E se assim for, como eu faço um tipo primitivo disponível em toda a minha classe. Eu sei que com os tipos de objetos, declaro-lo na minha interface e utilização @property e @synthesize ... o que é o equivalente (se existir) quando trabalhar com primitivas?

Foi útil?

Solução

Usando NSNumber para um contador simples não olhar um pouco de matar mais. Você pode declarar os membros da classe como NSInteger e simplesmente atualizá-los usando ++ ou + =

Por exemplo:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

O @synthesize é apenas:

@synthesize counter

e pode ser incrementado mediante:

self.counter += 1;

ou

counter ++;

o mais tarde irá prevenir quaisquer observadores de ser informado, assim, pode não ser preferível.

Outras dicas

NSNumber é uma representação objecto de um número. Eu usá-lo ao armazenar números em uma classe de coleção, porque eles só podem armazenar ponteiros de objeto.

Assim, no seu exemplo, que precisa de um contador, ele é provavelmente um exagero.

NSInteger é simplesmente um inteiro que é typedefed para ser seguro para 32 e 64 bit programas, e é recomendado pela Apple para uso em vez de int. Não é um objeto. Este é provavelmente o que você precisa para um contador (na verdade NSUInteger, que é um unsigned int) poderia ser melhor.

Como para fazer primitivas disponíveis em toda a sua classe - bem, se você declará-lo no cabeçalho como um iVar, ele está disponível em toda a sua classe de qualquer maneira. @property e @synthesize são apenas Objective-C 2.0 maneiras de declarar estes como propriedades que podem ser vistos (e talvez alteradas) fora de sua classe de uma maneira compatível com KVC / KVO. Tipos primitivos podem ser utilizados como propriedades usando o mesmo @property e @synthesize sintaxe.

Eu uso NSInteger (não int, para ser mais portátil), e envolvê-la em um NSNumber se eu precisar adicioná-lo a uma coleção (como um NSMutableDictionary ao salvar o estado de sair da aplicação).

Eu concordo com o seu instinto, usando um objeto para um simples sons de contador como um exagero e irá adicionar um número desnecessário de chamadas mensagem de despacho para simplesmente incrementar um contador. Para um contador que não precisam ser armazenados em uma coleção ou manipulado como um objeto, vara com tipos C escalar.

Para declarar um escalar como uma variável de instância de sua classe, apenas declará-lo em seu arquivo cabeçalho:

@interface MyClass: NSObject{
  int counter;
}

@end

Se você do necessidade de incrementar uma NSNumber (como para uma propriedade NSManagedObject) eu encontrei esta categoria ajudou:

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

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

para que possa simplificar as declarações de incremento para:

counter = [counter increment];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top