Objective-C静态,外部,公共variables
我想有一个variables,我可以通过导入一个头文件来访问任何地方,但我也希望它是静态的,只有其中一个创build。 在我的.m文件中,我指定了
static BOOL LogStuff = NO;
并在初始化方法中设置日志logging值:
+ (void)initialize { LogStuff = ... //whatever }
但是我希望能够通过导入.h文件来访问我的variables,所以我想要做这样的事情:
static extern BOOL LogStuff;
但我不能这样做。 是否有可能做我想做的事情? 谢谢
在静态类数据成员和静态类方法的上下文中,Objective-C中的static
与C ++类中的静态方法不同。 在C和Objective-C中,全局范围内的static
variables或函数意味着该符号具有内部链接 。
内部链接意味着该符号对于当前的翻译单元来说是本地的,它是当前正在编译的源文件( .c
或.m
)以及它recursion包含的所有头文件。 该符号不能从另一个翻译单元引用,并且可以在具有相同名称的其他翻译单元中使用内部链接的其他符号。
所以,如果你有一个头文件声明一个variables是static
,那么包含这个头文件的每个源文件都会得到一个单独的全局variables – 在一个源文件中对该variables的所有引用将引用相同的variables,但是在不同源文件中的引用将会参考不同的variables。
如果你想有一个单一的全局variables,你不能像C ++那样在类范围内。 一种方法是创build一个具有外部链接的全局variables:在头文件中用extern
关键字声明variables,然后在一个源文件中,在全局范围内定义它,而不使用extern
关键字。 内部链接和外部链接是相互排斥的 – 你不能有一个声明为extern
和static
的variables。
Panosbuild议 ,另一种方法是使用类方法而不是variables。 这将function保留在类的范围内,这使得语义更有意义,如果您愿意,也可以使其成为@private
。 它确实会增加边际性能损失,但这不太可能成为应用程序中的瓶颈(如果您怀疑它是,则始终首先进行configuration)。
如果LogStuff
是一个静态类字段,也许你可以实现静态getter和setter?
+ (void)setLogStuff:(BOOL)aLogStuff; + (BOOL)logStuff;
在头文件中声明它为extern BOOL
。 #import
头文件的文件不知道或在意外部符号是否是静态的。
独立的全局variables(每个源文件一个):
// .h static NSString * aStatic; //.m static NSString * aStatic = @"separate";
独特的全局variables:
// .h extern NSString * anExtern; // .m NSString * anExtern = @"global";
我通常使用这种布局来进行静态分析:
NSMutableArray *macroArray; BOOL keepMacro; + (void) startMacro { if (macroArray == nil) { macroArray = [[NSMutableArray alloc] initWithCapacity:100]; } [macroArray removeAllObjects]; keepMacro = YES; }
这是我的应用程序中的startMacro
命令。 Bool
和macroArray
都是静态的,但是注意它们没有被声明为static
或者extern
。
这可能不是最好的做法,但这是我所做的。