如果我的实现文件看起来像下面声明变量文件
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