2017-09-23 100 views
2

如果我的實現文件看起來像下面聲明變量文件

int someIntVariable; 

@implementation SomeClass 

- (void) foo { 
    someIntVariable = 0; 
} 

@end 

什麼是someIntVariable行爲。它對這個實現類或實例級別是靜態的嗎?以及它如何在文件外部訪問?

回答

1

因爲someIntVariable定義在@interface之外(這裏沒有包括),這意味着它不是一個實例變量。這是一個全球性的。

因爲你省略了static關鍵字,則意味着該變量在技術上是可用於任何其它編譯單元,但他們不得不來定義它自己extern參考:

extern int someIntVariable; 

如果你想要防止這種情況,即讓這家民營此特定編譯單元,你會包括SomeClass.msomeIntVariable正本報關的static關鍵字:

static int someIntVariable; 

請注意,您已在@implementation之外定義此全局變量。但值得注意的是,如果上述內容仍然在@implementation之內,也是如此。它具有完全相同的行爲,你的榜樣(一個全局變量,而不是一個實例變量,其他的編譯單元可以在您不知情的操作),如果它是@implementation內:

@implementation SomeClass 

int someIntVariable; 

- (void) foo { 
    someIntVariable = 0; 
} 

@end 

底線,如果你想靜行爲但希望確保它不能被外部編譯單元操縱,則您將聲明它爲static,如上所示。顯然,如果你想要一個實例變量,你可以在@interface中聲明這個(顯式聲明實例變量,或者現在更常見的聲明屬性,讓編譯器爲你合成ivar)。

+1

當然如果OP想要一個私有實例變量,他們可以這樣做:'@implementation {int someInVariable}'。 – rmaddy

+0

是的,那也適用。我通常仍然在私有類擴展的'@ interface'中定義私有實例變量,但是也將它包含在'@ implementation'作品的大括號中。 – Rob