Objective-C中的全局变量-extern和top of.m文件声明中的差异

Objective-C中的全局变量-extern和top of.m文件声明中的差异,objective-c,variables,global-variables,global,extern,Objective C,Variables,Global Variables,Global,Extern,我知道您可以使用“extern”在Objective-C中定义全局变量,但我刚刚意识到,在我使用第一个方法之前,我在.m文件顶部声明的变量也意外地是全局变量(这导致了一些问题)。我将它们移动到头文件的@interface部分,我认为它正确地声明了它们仅存在于类中,这解决了我的一些问题,但我仍然有点困惑 将变量声明为extern并将其放在.m文件的顶部有什么区别?或者这些结果是一样的吗?为了可读性和编译时执行,extern是一种显式声明的方式,您只是在这里声明这个变量,实际上期望它在其他地方定义。

我知道您可以使用“extern”在Objective-C中定义全局变量,但我刚刚意识到,在我使用第一个方法之前,我在.m文件顶部声明的变量也意外地是全局变量(这导致了一些问题)。我将它们移动到头文件的@interface部分,我认为它正确地声明了它们仅存在于类中,这解决了我的一些问题,但我仍然有点困惑


将变量声明为extern并将其放在.m文件的顶部有什么区别?或者这些结果是一样的吗?

为了可读性和编译时执行,extern是一种显式声明的方式,您只是在这里声明这个变量,实际上期望它在其他地方定义。如果您还试图定义extern变量,编译器将告诉您方法的错误。这对于全局变量非常有用,可以防止名称冲突和多个定义,这两种情况都会导致链接器错误。然而,extern关键字本身并不会使变量成为全局变量

使变量成为全局变量的是其声明在文件中的位置。如果您要在类的头文件中的@interface之外声明一个变量,那么您应该声明一个在类的所有实例之间共享并对所有导入头文件的人可见的变量。如果您要(而且显然已经)在class.m文件中的@implementation之外声明一个变量,那么您还应该声明一个在类的所有实例之间共享的变量,但导入您的头的任何人都看不到该变量


因此,使用变量声明的位置来确定范围。您将只在一个位置定义这些全局变量。对于您声明它们的所有其他位置,请在声明前加上extern,以使代码可读,目的明确,并确保不再尝试再次定义它。

Short version:extern表示它存在于某个位置,但不在此处。如果不在@interface或@implementation中使用它,则会使其成为全局的。