В отличие от Java, где статическая переменная имеет область видимости для всех экземпляров класса, static в C означает, что переменная доступна только из того файла, в котором она объявлена. Он позволяет вам делать такие вещи, как объявление статической переменной внутри функции, которая устанавливает значение только в первый раз, вот так.
Одна вещь, о которой вы не упомянули, - это связь между классами A, B и C. Если они находятся в иерархии наследования и вы ожидаете, что статическая переменная будет унаследована, как в Java, метод, описанный zpasternack будет работать.
Если три класса не связаны между собой, и вы просто хотите получить доступ к значению, объявленному в A, то extern - более подходящий способ. В этом случае вы хотите объявить переменную как extern в ClassA.h, а затем определить ее в Class.m. Пока ClassB и ClassC импортируют ClassA.h, они смогут связываться с одним и тем же определением extern.
Один замечательный момент заключается в том, что вместо использования 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 vs. extern. Однако в качестве принципа проектирования инкапсуляция, обеспечиваемая путем обертывания переменной методами класса, намного безопаснее, хотя и более сложна. В объектно-ориентированных языках, когда вы пытаетесь достичь эффекта статического метода класса, инкапсуляция, вероятно, является правильным путем.
person
Quinn Taylor
schedule
11.06.2009