В отличие от Java, где статическая переменная ограничена для всех экземпляров класса, static
в C означает, что переменная доступна только из файла, в котором она объявлена. Это позволяет вам делать такие вещи, как объявление статической переменной внутри функции, которая устанавливает значение только в первый раз, вот так .
Одна вещь, которую вы не упомянули, это отношения между классами A, B и C. Если они находятся в иерархии наследования, и вы ожидаете, что статическая переменная будет наследоваться, как в Java, метод, описанный zpasternack будет работать.
Если три класса не связаны, и вы просто хотите получить доступ к значению, объявленному в A, тогда extern
является более подходящим способом. В этом случае вы хотите объявить переменную как extern
в ClassA.h, а затем определить ее в Class.m. Пока ClassB и ClassC импортируют ClassA.h, они смогут ссылаться на одно и то же внешнее определение.
Одна тонкость в том, что вместо использования extern
более надежно использовать OBJC_EXPORT
, который определен в objc-api.h и также обрабатывает компиляцию в C ++. Вот пример кода:
// ClassA.h
OBJC_EXPORT NSString* commonString;
...
// ClassA.m
NSString* commonString = @"OldValue";
// ClassB.m
#import "ClassA.h"
...
commonString = @"NewValue"; // Can be inside a function or method
Конечно, использование внешних переменных таким способом создает печально известную, сильно порочащую глобальную переменную , которая хрупка в том смысле, что любой может ее прочитать или записать, и доступ к ней не контролируется. Это простой подход, и он отвечает на ваш вопрос об использовании static
против extern
. Однако в качестве принципа проектирования инкапсуляция, обеспечиваемая оборачиванием переменной методами класса, намного безопаснее, хотя и более сложна. В объектно-ориентированных языках, когда эффект, который вы пытаетесь достичь, - это эффект статического метода, инкапсуляция, вероятно, является правильным путем.