Objective-C静态,外部,公共变量

时间:2011-10-04 01:01:27

标签: objective-c static public extern

我希望有一个变量,我可以通过导入头文件在任何地方访问,但我也希望它是静态的,因为它们只创建了一个。在我的.m文件中,我指定了

static BOOL LogStuff = NO;

并在initialize方法中设置了日志记录值:

+ (void)initialize
{
    LogStuff = ... //whatever
}

但是我希望能够通过导入.h文件在任何地方访问我的变量,所以我想做这样的事情:

static extern BOOL LogStuff;

但我不允许这样做。有可能做我想做的事吗?感谢

5 个答案:

答案 0 :(得分:123)

在静态类数据成员和静态类方法的上下文中,Objective-C中的

static与C ++类中的static不同。在C和Objective-C中,全局范围内的static变量或函数意味着该符号具有内部链接

内部链接表示该符号是当前转换单元的本地符号,它是正在编译的当前源文件(.c.m)以及所有标题递归包含的文件。该符号不能从不同的翻译单元引用,并且您可以在其他具有相同名称的翻译单元中使用其他具有内部链接的符号。

因此,如果您有一个将变量声明为static的头文件,则包含该头的每个源文件都会获得一个单独的全局变量 - 在一个源文件中对该变量的所有引用将引用相同的变量,但不同源文件中的引用将引用不同的变量。

如果你想拥有一个全局变量,就不能像C ++那样在类范围内拥有它。一个选项是使用外部链接创建一个全局变量:在头文件中使用extern关键字声明变量,然后在一个源文件中,定义它在全球范围内没有extern关键字。内部链接和外部链接是互斥的 - 您不能将变量声明为externstatic

另一种选择,如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命令。 BoolmacroArray都是静态的,但请注意它们未被声明为staticextern

这可能不是最佳做法,但这就是我所做的。