Question

Je suis nouveau à Objective-C et Cocoa. J'ai lu que NSInteger et NSNumber sont préférés lorsque vous travaillez avec des nombres entiers simples parce qu'ils sont les versions « plate-forme de sécurité » des types primitifs numériques (et dans le cas de NSNumber, enveloppé dans un objet). , J'ai besoin d'un compteur dans ma classe qui obtient incrémenté lorsqu'un feu de NSTimer. Sur un forum d'Apple, j'ai trouvé un groupe de personnes tous les recommander à quelqu'un dans une situation similaire qu'ils déclarerait un pointeur NSNumber dans l'en-tête, l'initialiser avec numberWithInt :, puis à chaque fois qu'il doit être incrémentée faire en assignant à un nouvel objet (quelque chose comme counter = [NSNumber numberWithInt:[counter intValue]+1];). Cela ressemble surpuissant pour moi. Si tout ce que je besoin est un compteur int (et d'ailleurs, je réinitialiser à 0 après 15 frappe donc la taille est pas un problème), je ne peux pas vous en sortir avec juste en utilisant un int et ne pas avoir à allouer une nouvel objet à chaque itération de la boucle de mon horloge?

Et si oui, comment puis-je faire un type primitif disponible dans ma classe. Je sais que des types d'objet, je le déclare dans mon interface et utilise @property et @synthesize ... ce qui est l'équivalent (le cas échéant) lorsque vous travaillez avec des primitives?

Était-ce utile?

La solution

Utilisation NSNumber pour un simple compteur ne regarde un peu de plus de tuer. Vous pouvez déclarer les membres de la classe comme NSInteger et les mettre à jour en utilisant simplement ++ ou + =

par exemple:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

Le @synthesize est juste:

@synthesize counter

et peut être incrémentée soit par:

self.counter += 1;

ou

counter ++;

le plus tard empêchera les observateurs d'être informé, donc peut-être pas préférable.

Autres conseils

NSNumber est une représentation objet d'un nombre. Je l'utilise en stockant des numéros dans une classe de collection, car ils ne peuvent contenir des pointeurs d'objet.

Dans votre exemple, qui a besoin d'un compteur, il est probablement excessif.

NSInteger est simplement un entier qui est typedefed sans danger pour 32 et 64 programmes de bits, et il est recommandé par Apple pour une utilisation au lieu de int. Il est pas un objet. Ceci est probablement ce que vous avez besoin pour un compteur (en fait NSUInteger, qui est un unsigned int) pourrait être mieux.

pour faire des primitives disponibles tout au long de votre classe - bien, si vous déclarez dans l'en-tête comme iVar, il est disponible dans votre classe de toute façon. @property et @synthesize ne sont que Objective-C 2.0 façons de déclarer ceux-ci comme des propriétés qui peuvent être vus (et peut-être changé) à l'extérieur de votre classe d'une manière conforme à KVC / KVO. Les types primitifs peuvent être utilisés comme des propriétés en utilisant la même syntaxe @property et @synthesize.

J'utilise NSInteger (pas int, pour être plus portable), et l'envelopper dans un NSNumber si je dois l'ajouter à une collection (comme un NSMutableDictionary lors de l'enregistrement de l'état en quittant l'application).

Je suis d'accord avec votre instinct, à l'aide d'un objet pour un simple compteur sonne comme surpuissant et ajoutera un nombre inutile d'appels d'expédition des messages pour simplement incrémenter un compteur. Pour un compteur qui n'a pas besoin d'être stocké dans une collection ou manipulée comme un objet, le bâton avec les types scalaires C.

Pour déclarer un scalaire comme une variable d'instance de votre classe, déclare simplement dans votre fichier d'en-tête:

@interface MyClass: NSObject{
  int counter;
}

@end

Si vous ne incrémentiez un NSNumber (par exemple pour une propriété NSManagedObject) Je trouve cette catégorie a aidé:

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

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

vous pouvez simplifier les déclarations d'incrément à:

counter = [counter increment];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top