29 votes

Variables publiques, externes, statiques Objective-C

Je veux avoir une variable que je peux y accéder de n'importe où par l'importation d'un fichier d'en-tête, mais je veux aussi qu'il soit statique dans le sens où il y a seulement un de les créer. Dans mon .m fichier, je précise

static BOOL LogStuff = NO;

et dans la méthode initialize-je définir la valeur de l'enregistrement:

+ (void)initialize
{
    LogStuff = ... //whatever
}

Cependant, je veux être en mesure d'accéder à ma variable n'importe où par l'importation de la .h fichier donc je veux faire quelque chose comme ceci:

static extern BOOL LogStuff;

mais je ne suis pas autorisé à le faire. Est-il possible de faire la chose que je suis en train de faire? Merci

97voto

Adam Rosenfield Points 176408

static en Objective-C signifie une chose différente de static dans une classe C++, dans le contexte de la classe statique des données membres statiques et les méthodes de la classe. En C et Objective-C, un static variable ou de la fonction à la portée globale signifie que ce symbole a une liaison interne.

Une liaison interne signifie que ce symbole est celui du courant de l'unité de traduction, qui est la source de courant de fichier (.c ou .m) en cours de compilation et de tous les fichiers d'en-tête récursivement la comprend. Ce symbole ne peut pas être référencé à partir d'une autre unité de traduction, et vous pouvez avoir d'autres symboles avec une liaison interne dans d'autres unités de traduction avec le même nom.

Donc, si vous avez un fichier d'en-tête de la déclaration d'une variable en tant que static, chaque fichier source qui comprend que l'en-tête obtient un distinct variable globale-toutes les références de cette variable à l'intérieur d'un fichier de source de référence à la même variable, mais les références dans les différents fichiers sources se réfèrent à différentes variables.

Si vous voulez avoir une seule variable globale, vous ne pouvez pas l'avoir à portée de classe comme en C++. Une option consiste à créer une variable globale avec une liaison externe: la déclaration de la variable avec l' extern mot-clé dans un fichier d'en-tête, puis, dans un fichier source, de la définir de manière globale, sans l' extern mot-clé. Une liaison interne et externe de liaison sont mutuellement exclusives, vous ne pouvez pas avoir une variable déclarée comme les deux extern et static.

Une alternative, comme Panos suggéré, serait d'utiliser une méthode de la classe au lieu d'une variable. Cela permet de maintenir la fonctionnalité dans le cadre de la classe, qui fait plus de sens du point de vue sémantique, et vous pouvez aussi le faire @private si vous le désirez. Il ne s'ajouter un rendement marginal de pénalité, mais c'est très rare d'être le goulot d'étranglement dans votre application (si vous soupçonnez il est, toujours de profil).

3voto

Panos Points 791

Si LogStuff est un champ de classe statique, peut-être pouvez-vous implémenter un getter et un setter statiques?

 + (void)setLogStuff:(BOOL)aLogStuff;
+ (BOOL)logStuff;
 

3voto

NSResponder Points 14459

Déclarez-le extern BOOL dans votre fichier d'en-tête. Les fichiers que #import votre en-tête ne savent pas ou ne se soucient pas si le symbole externe est statique ou non.

0voto

Volure DarkAngel Points 5916

j'utilise normalement cette disposition pour ma statique.

 NSMutableArray *macroArray;
BOOL keepMacro;

+ (void) startMacro
{
    if (macroArray == nil)
    {
        macroArray = [[NSMutableArray alloc] initWithCapacity:100];
    }

    [macroArray removeAllObjects];
    keepMacro = YES;
}
 

c'est la commande startMacro dans mon application. Le Bool et le macroArray sont tous deux statiques. Mais notez qu'ils ne sont pas déclarés statiques ou externes.

Ce n'est peut-être pas la meilleure pratique, mais c'est ce que je fais.

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