如果我的實現文件看起來像下面聲明變量文件
int someIntVariable;
@implementation SomeClass
- (void) foo {
someIntVariable = 0;
}
@end
什麼是someIntVariable
行爲。它對這個實現類或實例級別是靜態的嗎?以及它如何在文件外部訪問?
如果我的實現文件看起來像下面聲明變量文件
int someIntVariable;
@implementation SomeClass
- (void) foo {
someIntVariable = 0;
}
@end
什麼是someIntVariable
行爲。它對這個實現類或實例級別是靜態的嗎?以及它如何在文件外部訪問?
因爲someIntVariable
定義在@interface
之外(這裏沒有包括),這意味着它不是一個實例變量。這是一個全球性的。
因爲你省略了static
關鍵字,則意味着該變量在技術上是可用於任何其它編譯單元,但他們不得不來定義它自己extern
參考:
extern int someIntVariable;
如果你想要防止這種情況,即讓這家民營此特定編譯單元,你會包括SomeClass.m
在someIntVariable
正本報關的static
關鍵字:
static int someIntVariable;
請注意,您已在@implementation
之外定義此全局變量。但值得注意的是,如果上述內容仍然在@implementation
之內,也是如此。它具有完全相同的行爲,你的榜樣(一個全局變量,而不是一個實例變量,其他的編譯單元可以在您不知情的操作),如果它是@implementation
內:
@implementation SomeClass
int someIntVariable;
- (void) foo {
someIntVariable = 0;
}
@end
底線,如果你想靜行爲但希望確保它不能被外部編譯單元操縱,則您將聲明它爲static
,如上所示。顯然,如果你想要一個實例變量,你可以在@interface
中聲明這個(顯式聲明實例變量,或者現在更常見的聲明屬性,讓編譯器爲你合成ivar)。
當然如果OP想要一個私有實例變量,他們可以這樣做:'@implementation {int someInVariable}'。 – rmaddy
是的,那也適用。我通常仍然在私有類擴展的'@ interface'中定義私有實例變量,但是也將它包含在'@ implementation'作品的大括號中。 – Rob