2010-06-16 252 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