static
en Objective-C ne signifie pas la même chose que static
dans une classe C++, dans le contexte des membres de données de classe statiques et des méthodes de classe statiques. En C et en Objective-C, un static
variable ou fonction à portée globale signifie que ce symbole a lien interne .
Un lien interne signifie que ce symbole est local à l'objet courant. unité de traduction qui est le fichier source actuel ( .c
ou .m
) en cours de compilation et tous les fichiers d'en-tête qu'il inclut récursivement. Ce symbole ne peut pas être référencé à partir d'une unité de traduction différente, et vous pouvez avoir d'autres symboles avec des liens internes dans d'autres unités de traduction avec le même nom.
Ainsi, si vous avez un fichier d'en-tête qui déclare une variable comme étant static
chaque fichier source qui inclut cet en-tête reçoit un message séparé toutes les références à cette variable dans un fichier source feront référence à la même variable, mais les références dans des fichiers sources différents feront référence à la variable différents variables.
Si vous voulez avoir une seule variable globale, vous ne pouvez pas l'avoir dans la portée de la classe comme en C++. Une option consiste à créer une variable globale avec lien externe : déclarer la variable avec l'attribut extern
dans un fichier d'en-tête, et ensuite dans un définissez-le à l'échelle globale sans la balise extern
mot-clé. La liaison interne et la liaison externe s'excluent mutuellement : une variable ne peut pas être déclarée à la fois en tant que extern
et static
.
Une alternative, comme Panos a suggéré serait d'utiliser une méthode de classe au lieu d'une variable. Cela permet de conserver la fonctionnalité dans la portée de la classe, ce qui est plus logique d'un point de vue sémantique. @private
si vous le souhaitez. Cela ajoute une pénalité de performance marginale, mais il est très peu probable que ce soit le goulot d'étranglement de votre application (si vous pensez que c'est le cas, commencez toujours par établir un profil).