2012-09-09 49 views
2

在下面的代碼段:配售變量實現在Objective-C

@implementation Foo 
NSString* bar = @"Some text."; 

... 

@end 

bar一個靜態變量,或者是某種類或實例變量?具體而言,它是如何比執行以下不同:

static NSString* bar = @"Some text."; 
@implementation Foo 

... 

@end 

回答

7

在第一示例中,bar是一個全局變量,具有全局鏈接能見度向外界..

在第二個例子,是bar一個靜態變量,僅具有本地文件可見性(即該符號在當前編譯單元之外不可見)。

對於這兩個示例,它們相對於Objective-C關鍵字@implementation的定位是無關緊要的。它們與Objective-C類完全無關,無論是否在@implementation範圍內都可以運行。

+0

所以,要明確,它們都是靜態變量。但是,這兩個變量的鏈接器範圍是不同的。此鏈接器作用域由使用static關鍵字確定,是否正確? – Brett

+0

+1。我沒有注意到他的一個例子是靜態的,另一個沒有,加上忍者等等。我認爲他的意思是「在實施和實施之外聲明它有什麼區別?」 – Metabble

+2

@Brett NO。它們不是靜態變量。第一個是外部可見變量的定義。第二個是一個靜態變量,根據定義,它具有本地文件範圍,並且不會發送鏈接器可見符號。 –

0

據我所知,一個方法之外定義的所有變量都是全局定義的。它們在大多數任何語言中都與全局變量相同。它們不是隱式靜態的(AFAIK),但可以明確地這樣做。 我不認爲你的兩個例子有區別,但我可能是錯的。 我沒有注意到你讓第二個例子顯式靜態。最頂層的是全局的,最底層的是全局和靜態的(文件範圍)。