Objective-C statique, extern, les variables publiques
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? Grâce
Vous devez vous connecter pour publier un commentaire.
static
en Objective-C signifie une chose différente destatic
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, unstatic
variable ou de la fonction à la portée globale signifie que ce symbole a liaison interne.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 comme
static
, chaque fichier source qui comprend que l'en-tête obtient un séparé 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 reportez-vous à différents 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 liaison externe: déclarer la variable avec le
extern
mot-clé dans un fichier d'en-tête, puis dans un fichier source, de la définir de manière globale sans laextern
mot-clé. Une liaison interne et externe de liaison sont mutuellement exclusives, vous ne pouvez pas avoir une variable déclarée comme les deuxextern
etstatic
.Une alternative, comme Panos a 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).Si
LogStuff
est une classe statique champ, peut-être que vous pouvez mettre en œuvre statique getter et setter?Déclarer
extern BOOL
dans votre fichier d'en-tête. Les fichiers qui#import
votre en-tête de ne pas savoir ou de soins, ou si le symbole externe est statique ou non.Séparé variable globale (un par fichier source):
Unique variable globale:
J'ai l'habitude d'utiliser cette mise en page pour mon statique:
C'est le
startMacro
commande dans mon application. À la fois leBool
et lamacroArray
sont statiques, mais remarquez qu'ils ne sont pas déclaréesstatic
ouextern
.Cela peut ne pas être la meilleure pratique, mais c'est ce que je fais.