如果我的实现文件如下所示
int someIntVariable;
@implementation SomeClass
- (void) foo {
someIntVariable = 0;
}
@end
someIntVariable
的行为是什么?它对此实现类或实例级别是静态的吗?如何在文件外部访问?
答案 0 :(得分:1)
因为someIntVariable
是在@interface
之外定义的(这里没有包含),这意味着它不是实例变量。这是全球性的。
因为你省略了static
关键字,这意味着这个变量在技术上可用于任何其他编译单元,尽管他们必须定义自己的extern
引用:
extern int someIntVariable;
如果您想要阻止这种情况,即将此隐私设置为此特定编译单元,则必须在static
中someIntVariable
的原始声明中包含SomeClass.m
关键字:
static int someIntVariable;
注意,您已在@implementation
之外定义了此全局变量。但值得注意的是,如果它也在@implementation
内,上述内容仍然适用。它表现出与你的例子完全相同的行为(一个全局变量,而不是一个实例变量,其他编译单元可以在你不知情的情况下进行操作),如果它在@implementation
内:
@implementation SomeClass
int someIntVariable;
- (void) foo {
someIntVariable = 0;
}
@end
最重要的是,如果你想要静态行为,但想确保它不能被外部编译单元操纵,你可以将它声明为static
,如上所示。显然,如果你想要一个实例变量,你可以在@interface
中声明这一点(显式声明实例变量,或者现在更常见的是声明属性,让编译器为你合成ivar)。