static
в Objective-C означает нечто иное, чем static
в классе C ++, в контексте членов данных статического класса и методов статического класса.В C и Objective-C переменная или функция static
в глобальной области означает, что этот символ имеет внутреннюю связь .
Внутренняя связь означает, что этот символ является локальным по отношению к текущему единица перевода , которая является текущим исходным файлом (.c
или .m
), который компилируется и все файлы заголовков, которые он рекурсивно включает.На этот символ нельзя ссылаться из другой единицы перевода, и у тебя могут быть другие символы с внутренней связью в других единицах перевода с тем же именем.
Так, если у тебя есть файл заголовка, объявляющий переменную как static
каждый исходный файл, который включает этот заголовок, получает отдельную глобальную переменную - все ссылки на эту переменную в одном исходном файле будут ссылаться на одну и ту же переменную, но ссылки в разных исходных файлах будут ссылаться на разные переменных.
Если вы хотите иметь одну глобальную переменную, вы не можете иметь ее в области видимости класса, как в C ++.Один из вариантов - создать глобальную переменную с внешней связью : объявить переменную с ключевым словом extern
в заголовочном файле, а затем в одном исходном файле определить ее в глобальной области видимостибез ключевого слова extern
.Внутренняя связь и внешняя связь являются взаимоисключающими - вы не можете иметь переменную, объявленную как extern
и static
.
Альтернативой, как Panos предложил , было бы использование классаметод вместо переменной.Это сохраняет функциональность в рамках класса, что имеет смысл семантически, и вы также можете сделать это @private
, если хотите.Это добавляет незначительное снижение производительности, но это вряд ли будет узким местом в вашем приложении (если вы подозреваете, что это так, всегда сначала профилируйте).