JPC*_*JPC 38 static public objective-c extern
我希望有一个变量,我可以通过导入头文件访问任何地方,但我也希望它是静态的,因为它只创建了一个.在我的.m文件中,我指定
static BOOL LogStuff = NO;
在initialize方法中我设置了日志记录值:
+ (void)initialize
{
    LogStuff = ... //whatever
}
但是我希望能够通过导入.h文件在任何地方访问我的变量,所以我想做这样的事情:
static extern BOOL LogStuff;
但我不允许这样做.有可能做我想做的事吗?谢谢
Ada*_*eld 124
static在Objective-C中static,在静态类数据成员和静态类方法的上下文中,与C++类不同.在C和Objective-C中,static全局范围内的变量或函数意味着该符号具有内部链接.
内部链接意味着该符号是当前转换单元的本地符号,它是正在编译的当前源文件(.c或.m)以及它递归包含的所有头文件.该符号不能从不同的翻译单元引用,并且您可以在其他具有相同名称的翻译单元中使用其他具有内部链接的符号.
因此,如果您有一个声明变量的头文件static,则包含该头的每个源文件都会获得一个单独的全局变量 - 在一个源文件中对该变量的所有引用都将引用相同的变量,但不同源文件中的引用将引用对不同的变量.
如果你想拥有一个全局变量,就不能像C++那样在类范围内拥有它.一种选择是使用外部链接创建一个全局变量:extern在头文件中使用关键字声明变量,然后在一个源文件中,在没有extern关键字的全局范围内定义它.内部链接和外部链接是互斥的 - 您不能将变量声明为extern和static.
正如Panos所建议的那样,另一种方法是使用类方法而不是变量.这使得功能保持在类的范围内,这在语义上更有意义,并且@private如果您愿意,您也可以创建它.它确实增加了边际性能损失,但这不太可能成为您的应用程序的瓶颈(如果您怀疑它是,总是首先配置文件).
小智 5
如果LogStuff是静态类字段,也许您可以实现静态 getter 和 setter?
+ (void)setLogStuff:(BOOL)aLogStuff;
+ (BOOL)logStuff;