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