2012-03-16 57 views
2
int helloness; 
@interface test : NSObject 
@end 

VS上述VS低于@interface

@interface test : NSObject{ 
int helloness; 
} 
@end 

难道我明白,下面是真实和声明变量上述两个区块之间的唯一有意义的差异:

  • 在这两个区块中,执行test.m可以在内部使用helloness变量,如第一个块中的ivar
  • helloness将存在,在第二块

在第一块进口这.h但在其他公开的,只有test.m任何类,这是技术上的什么被认为是在任何类中的“全局变量”是进口这将有权访问helloness的相同内容?

如果多个头文件有helloness的声明并将其全部导入,会发生什么情况?

这个类似,认为这是实现:

@implementation AClass 

int food=5; 

这里,food的作用就像一个内部伊娃,即使它不以任何@interface声明?

回答

2

在第一个示例中,helloness是一个全局变量。可以通过导入该头文件的任何文件看到。如果您包含多个标头,这些标头也会声明一个int helloness变量,我相信您会收到来自编译器的警告,并且它们都将指向相同的内存位置。如果您包含另一个声明helloness不是int类型的标头,我相信您会收到一个编译器错误。

在第二个例子中,helloness一个实例变量(ivar)。它的值(内存位置)特定于每个AClass的实例。 (任何东西都可以访问它:例如AClass *instance = [[AClass alloc] init]; instance->helloness = 7;但是,ObjC中通常避免直接访问ivars - 我们使用访问器和/或属性来代替。)

在第三种情况下,food仍然是一个全局变量,但其知名度仅限于它在声明的执行文件。的AClass任何情况下,以及在同一个文件实现的任何其他类或类别或功能,可以参考food,并且所有这些引用都是指向相同的内存位置。

+0

,这就好像我在它之前添加了'static',在另一个单词,一个类变量? – johnbakers 2012-03-16 06:07:37

+0

不完全 - 我遗漏了一些东西。使用'static',它的行为就像是一个“类变量”:只有在同一个文件中才能看到。如果没有'static',声明对其他文件是不可见的,但*符号*是......我认为他们可以用'extern'得到它,更重要的是,如果你有'食物'在其他文件中。 (在实现文件中没有声明'static'的全局变量并不是我们经常看到的东西,而且可能有充分的理由。) – rickster 2012-03-16 06:33:27

2

在第一个示例中,helloness是一个全局变量。在你的第二个例子中,它是一个实例变量。

程序中只能有一个具有给定名称的全局变量。对于在您的程序执行期间创建的每个类实例,都有一个实例变量的副本。它们在语义上根本不相似。

在头文件中有一个全局变量,因为我假定你在第一个例子中做了,因为你指的是#import,这可能是一个坏主意。如果它不像你的那样是一个试探性的定义(例如,如果你改为int helloness = 12;),那么链接时你将会遇到多重定义的符号错误。

在你的最后一个例子中,food仍然是一个全局变量,但由于它很可能在实现文件(而不是头文件)中,所以你可能不会遇到任何乘法定义的符号错误。它不会工作像一个实例变量,但它仍然是一个全局变量。

+0

如果一个全局变量在头文件中不是*(因为我认为你的建议不应该在头文件中),那么另一个类怎样才能访问它呢?我试着将它移动到实现中,但只是将它公开给特定的类。 – johnbakers 2012-03-16 05:56:37

+0

编译单元引用其他地方定义的全局变量的常用方法是使用'extern'关键字。 – 2012-03-16 05:58:42

+0

我尝试了'extern int helloness',然后我在'.m'的'@ implementation'行之前或之后尝试了'int helloness',但'helloness'没有暴露给导入'.h ' – johnbakers 2012-03-16 06:03:33