46 votes

Variables de classe statiques Objective C

je suis nouveau à l'objective-c et je suis de la lecture d'un livre intitulé "Visual Quickstart Guide: Objective-C" par Steven Holzner, Peachpit Press

dans le Chapitre 6: la Programmation Orientée Objet, il y a une section appelée à l'Aide de Variables de Classe où il écrit:

"Vous pouvez créer des variables de classe pour une utilisation avec vos classes, mais il y a un hic: chaque objet de cette classe d'actions de la même variable, de sorte si un objet de changements d'une variable de classe, qui variable est modifié pour tous les objets. Vous créez variables de classe avec le mot clé static. Variables de classe sont souvent utiles: par exemple, vous pouvez utiliser une variable de classe pour garder une trace de le nombre d'objets d'une classe particulière créé dans un programme. Vous allez faire dans cette tâche."

et dit d'entrer le code suivant:

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

ce code me donne une erreur dans xcode4: Ne peut pas déclarer une variable à l'intérieur de @interface ou @protocole

le livre est-il mauvais ou suis-je en train de faire quelque chose de mal?

merci

100voto

mipadi Points 135410

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, il fonctionne de la même manière qu'une variable de classe. Cependant, il ne s'agit en réalité que d'une variable statique C accessible par l'implémentation de la classe.

15voto

zoul Points 51637

J'ai vu un Visual Quickstart Guide sur Unix et suçait le gros temps. Ce ne semble pas être beaucoup mieux, au moins à partir de l'échantillon. La bonne façon de créer une variable de classe 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 un vrai variable de classe. Mais vous ne devriez pas vous soucier de variables de classe trop de toute façon, ils sont habituellement un signe que vous êtes en train de faire quelque chose de mal. (Je suis trop simplifier un peu, mais pas trop.)

Si vous êtes à la recherche pour une vie décente Objective-C livre, lire la un par Apple. C'est gratuit et c'est une bonne lecture.

11voto

ctd Points 41

Si la "variable de classe" nécessite davantage qu'une initialisation triviale, 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;
}
 

6voto

EJV Points 464

Vous devez déclarer la variable dans le fichier .m, où est placé @implementation. 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X