2010-06-16 172 views
0
// in ClassA.h 
static NSString *globalStr = @"HelloWorld"; 

@interface ClassA 
    ... 
@end 

// in ClassB.h 
#include "ClassA.h" 

// in ClassB.m 
... 
NSLog(@"The global string: %@", globalStr); 
... 

在C++中,“static”应该表示变量或函数具有内部链接。
但是在这种情况下它被用来共享变量,没有static关键字就会发生错误。Obj-C中的静态全局变量?

我很困惑,有人能告诉我背后的概念吗?
谢谢!

回答

5

static在Objective-C中的含义与C中的含义完全相同 - 它具有内部链接和静态存储持续时间。在这种情况下,您将得到一个不包含static的错误,因为每个对象的源代码都包含ClassA.h的复制符号为globalStr。你不是分享任何东西 - 你会得到每个编译单元globalStr的新副本。

不要在你的头文件中放置对象定义,你会变得更好。如果你想一个全局的字符串,你需要把

extern NSString *globalStr; 

ClassA.h,并在定义它究竟是一个实现文件为:

NSString *globalStr = @"HelloWorld"; 
+1

它有助于记住,头被*逐字复制*到它们包含的文件中。您不会与导入标题的其他文件“共享”变量 - 标题导致所有这些文件都包含声明“static NSString * globalStr = @”HelloWorld“' 。 – Chuck 2010-06-16 17:33:55

+0

我想我应该补充说,你会有相同的错误在C++ .... – 2010-06-16 17:51:55

+0

谢谢,但我真的不知道为什么有一个“重复的符号”。你能再解释一下吗,再次感谢。 – 2010-06-19 09:06:16