我希望有一个变量,我可以通过导入头文件在任何地方访问,但我也希望它是静态的,因为它们只创建了一个。在我的.m文件中,我指定了
static BOOL LogStuff = NO;
并在initialize方法中设置了日志记录值:
+ (void)initialize
{
LogStuff = ... //whatever
}
但是我希望能够通过导入.h文件在任何地方访问我的变量,所以我想做这样的事情:
static extern BOOL LogStuff;
但我不允许这样做。有可能做我想做的事吗?感谢
答案 0 :(得分:123)
static
与C ++类中的static
不同。在C和Objective-C中,全局范围内的static
变量或函数意味着该符号具有内部链接。
内部链接表示该符号是当前转换单元的本地符号,它是正在编译的当前源文件(.c
或.m
)以及所有标题递归包含的文件。该符号不能从不同的翻译单元引用,并且您可以在其他具有相同名称的翻译单元中使用其他具有内部链接的符号。
因此,如果您有一个将变量声明为static
的头文件,则包含该头的每个源文件都会获得一个单独的全局变量 - 在一个源文件中对该变量的所有引用将引用相同的变量,但不同源文件中的引用将引用不同的变量。
如果你想拥有一个全局变量,就不能像C ++那样在类范围内拥有它。一个选项是使用外部链接创建一个全局变量:在头文件中使用extern
关键字声明变量,然后在一个源文件中,定义它在全球范围内没有extern
关键字。内部链接和外部链接是互斥的 - 您不能将变量声明为extern
和static
。
另一种选择,如Panos suggested,将使用类方法而不是变量。这使得功能保持在类的范围内,这在语义上更有意义,如果您愿意,也可以使它@private
。它确实会增加一个边际性能损失,但这不太可能成为您应用程序的瓶颈(如果您怀疑它是,总是先配置文件)。
答案 1 :(得分:4)
如果LogStuff
是一个静态类字段,你可以实现静态getter和setter吗?
+ (void)setLogStuff:(BOOL)aLogStuff;
+ (BOOL)logStuff;
答案 2 :(得分:3)
在头文件中声明extern BOOL
。 #import
您的标题不知道或关注外部符号是否为静态的文件。
答案 3 :(得分:1)
单独的全局变量(每个源文件一个):
// .h
static NSString * aStatic;
//.m
static NSString * aStatic = @"separate";
唯一全局变量:
// .h
extern NSString * anExtern;
// .m
NSString * anExtern = @"global";
答案 4 :(得分:0)
我通常将此布局用于我的静力学:
NSMutableArray *macroArray;
BOOL keepMacro;
+ (void) startMacro
{
if (macroArray == nil)
{
macroArray = [[NSMutableArray alloc] initWithCapacity:100];
}
[macroArray removeAllObjects];
keepMacro = YES;
}
这是我的应用程序中的startMacro
命令。 Bool
和macroArray
都是静态的,但请注意它们未被声明为static
或extern
。
这可能不是最佳做法,但这就是我所做的。