2017-09-23 63 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