2012-03-16 22 views
2
int helloness; 
@interface test : NSObject 
@end 

VS上述VS低於@interface

@interface test : NSObject{ 
int helloness; 
} 
@end 

難道我明白,下面是真實和聲明變量上述兩個區塊之間的唯一有意義的差異:

  • 在這兩個區塊中,執行test.m可以在內部使用helloness變量,如第一個塊中的ivar
  • helloness將存在,在第二塊

在第一塊進口這.h但在其他公開的,只有test.m任何類,這是技術上的什麼被認爲是在任何類中的「全局變量」是進口這將有權訪問helloness的相同內容?

如果多個頭文件有helloness的聲明並將其全部導入,會發生什麼情況?

這個類似,認爲這是實現:

@implementation AClass 

int food=5; 

這裏,food的作用就像一個內部伊娃,即使它不以任何@interface聲明?

回答

2

在第一個示例中,helloness是一個全局變量。可以通過導入該頭文件的任何文件看到。如果您包含多個標頭,這些標頭也會聲明一個int helloness變量,我相信您會收到來自編譯器的警告,並且它們都將指向相同的內存位置。如果您包含另一個聲明helloness不是int類型的標頭,我相信您會收到一個編譯器錯誤。

在第二個例子中,helloness一個實例變量(ivar)。它的值(內存位置)特定於每個AClass的實例。 (任何東西都可以訪問它:例如AClass *instance = [[AClass alloc] init]; instance->helloness = 7;但是,ObjC中通常避免直接訪問ivars - 我們使用訪問器和/或屬性來代替。)

在第三種情況下,food仍然是一個全局變量,但其知名度僅限於它在聲明的執行文件。的AClass任何情況下,以及在同一個文件實現的任何其他類或類別或功能,可以參考food,並且所有這些引用都是指向相同的內存位置。

+0

,這就好像我在它之前添加了'static',在另一個單詞,一個類變量? – johnbakers 2012-03-16 06:07:37

+0

不完全 - 我遺漏了一些東西。使用'static',它的行爲就像是一個「類變量」:只有在同一個文件中才能看到。如果沒有'static',聲明對其他文件是不可見的,但*符號*是......我認爲他們可以用'extern'得到它,更重要的是,如果你有'食物'在其他文件中。 (在實現文件中沒有聲明'static'的全局變量並不是我們經常看到的東西,而且可能有充分的理由。) – rickster 2012-03-16 06:33:27

2

在第一個示例中,helloness是一個全局變量。在你的第二個例子中,它是一個實例變量。

程序中只能有一個具有給定名稱的全局變量。對於在您的程序執行期間創建的每個類實例,都有一個實例變量的副本。它們在語義上根本不相似。

在頭文件中有一個全局變量,因爲我假定你在第一個例子中做了,因爲你指的是#import,這可能是一個壞主意。如果它不像你的那樣是一個試探性的定義(例如,如果你改爲int helloness = 12;),那麼鏈接時你將會遇到多重定義的符號錯誤。

在你的最後一個例子中,food仍然是一個全局變量,但由於它很可能在實現文件(而不是頭文件)中,所以你可能不會遇到任何乘法定義的符號錯誤。它不會工作像一個實例變量,但它仍然是一個全局變量。

+0

如果一個全局變量在頭文件中不是*(因爲我認爲你的建議不應該在頭文件中),那麼另一個類怎樣才能訪問它呢?我試着將它移動到實現中,但只是將它公開給特定的類。 – johnbakers 2012-03-16 05:56:37

+0

編譯單元引用其他地方定義的全局變量的常用方法是使用'extern'關鍵字。 – 2012-03-16 05:58:42

+0

我嘗試了'extern int helloness',然後我在'.m'的'@ implementation'行之前或之後嘗試了'int helloness',但'helloness'沒有暴露給導入'.h ' – johnbakers 2012-03-16 06:03:33