Objective C variables de classe statiques

Je suis novice en Objective C et je lis un livre intitulé “Visual Quickstart Guide: Objective-C” de Steven Holzner, Peachpit Press

Au chapitre 6: Programmation orientée object, il y a une section intitulée Utiliser les variables de classe où il écrit:

Vous pouvez créer des variables de classe à utiliser avec vos classes, mais il y a un accroc: chaque object de cette classe partage la même variable, donc si un object modifie une variable de classe, cette variable est modifiée pour tous les objects. Vous créez des variables de classe avec le mot-clé static. Les variables de classe sont souvent utiles: par exemple, vous pouvez utiliser une variable de classe pour suivre le nombre d’objects d’une classe particulière créée dans un programme. Vous allez le faire dans cette tâche.

Et dit d’entrer le code suivant:

#import  #import  @interface TheClass: NSObject static int count; //error: cannot declare variable inside @interface or @protocol +(int) getCount; @end ... 

Ce code me donne une erreur dans Xcode 4:

Impossible de déclarer une variable dans @interface ou @protocol

Le livre est-il faux ou est-ce que je fais quelque chose de mal?

Vous déclarez la variable statique dans le fichier d’implémentation (fichier .m ). Cela devrait fonctionner:

 // TheClass.h @interface TheClass : NSObject + (int)count; @end // TheClass.m static int theCount = 0; @implementation TheClass + (int) count { return theCount; } @end 

Ce n’est pas une variable de classe en soi; Objective-C n’a aucune notion de variable de classe. Cependant, couplé à la méthode de classe pour récupérer cette variable, elle fonctionne de la même manière qu’une variable de classe. Cependant, ce n’est vraiment qu’une variable statique C accessible par l’implémentation de la classe.

J’ai vu un Guide de démarrage rapide Visual à propos d’Unix et il a pris du temps. Celui-ci ne semble pas être beaucoup mieux, du moins de l’échantillon. La manière correcte de créer une variable de classe dans Objective-C ressemble à ceci:

 // Counted.h @interface Counted : NSObject + (NSUInteger) numberOfInstances; @end // Counted.m #import "Counted.h" static NSUInteger instances = 0; @implementation Counted - (id) init { … instances++; … } - (void) dealloc { instances--; } + (NSUInteger) numberOfInstances { return instances; } @end 

C’est en fait une variable statique, pas une vraie variable de classe. Mais de toute façon, vous ne devriez pas trop vous soucier des variables de classe, elles indiquent généralement que vous faites quelque chose de mal. (Je simplifie un peu, mais pas beaucoup.)

Si vous cherchez un livre Objective-C décent, lisez celui d’Apple . C’est gratuit et c’est une bonne lecture.

Si la “variable de classe” nécessite plus qu’une initialisation sortingviale, utilisez dispatch_once :

 @interface Foo () + (Foo *)singleton; @end + (Foo *)singleton { static Foo *_singleton; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _singleton = [[Foo alloc] init]; }); return _singleton; } 

Vous devez déclarer la variable dans le fichier .m, où la mise en œuvre est placée. Alors,

 #import "TheClass.h" static int count; @implementation ... @end 

Il est important de noter que Objective-C ne prend pas en charge les variables de classe. Mais vous pouvez les simuler avec des variables statiques, comme nous le faisons ici.