在实现(.m)文件中声明变量

时间:2017-09-23 14:45:31

标签: objective-c

如果我的实现文件如下所示

int someIntVariable;

@implementation SomeClass

- (void) foo {
    someIntVariable = 0;
}

@end

someIntVariable的行为是什么?它对此实现类或实例级别是静态的吗?如何在文件外部访问?

1 个答案:

答案 0 :(得分:1)

因为someIntVariable是在@interface之外定义的(这里没有包含),这意味着它不是实例变量。这是全球性的。

因为你省略了static关键字,这意味着这个变量在技术上可用于任何其他编译单元,尽管他们必须定义自己的extern引用:

extern int someIntVariable;

如果您想要阻止这种情况,即将此隐私设置为此特定编译单元,则必须在staticsomeIntVariable的原始声明中包含SomeClass.m关键字:

static int someIntVariable;

注意,您已在@implementation之外定义了此全局变量。但值得注意的是,如果它也在@implementation内,上述内容仍然适用。它表现出与你的例子完全相同的行为(一个全局变量,而不是一个实例变量,其他编译单元可以在你不知情的情况下进行操作),如果它在@implementation内:

@implementation SomeClass

int someIntVariable;

- (void) foo {
    someIntVariable = 0;
}

@end

最重要的是,如果你想要静态行为,但想确保它不能被外部编译单元操纵,你可以将它声明为static,如上所示。显然,如果你想要一个实例变量,你可以在@interface中声明这一点(显式声明实例变量,或者现在更常见的是声明属性,让编译器为你合成ivar)。