如何在Objective-C中使用全局变量?

sri*_*sri 20 objective-c

我应该如何在Objective-C项目中声明一个全局变量?

dre*_*lax 28

传统上,全局变量在标头中声明,并在源文件中定义.其他源文件只需要知道如何声明它使用它(即它的类型和名称).只要变量在源文件中的某处定义,链接器就能够找到它并将其他源文件中的所有引用适当地链接到定义.

在标题的某处,您将声明一个如下全局变量:

extern int GlobalInt;
Run Code Online (Sandbox Code Playgroud)

extern部分告诉编译器这只是一个声明,由一个int标识的类型的对象GlobalInt存在.它可以在以后定义,也可以不定义(编译器不负责确保它存在,这是链接器的工作).在这方面,它类似于功能原型.

在您的一个源文件中,您定义GlobalInt整数:

int GlobalInt = 4;
Run Code Online (Sandbox Code Playgroud)

现在,包含标题的每个文件都可以访问GlobalInt,因为标题表明它存在,所以编译器很高兴,链接器会在你的一个源文件中看到它,所以它也会很高兴.只是不要定义两次!

然而


您应该考虑这种方法是否有用.全局变量由于多种原因而变得混乱(试图找出确切定义或声明的位置,线程问题),通常不需要全局变量.您应该考虑使用单例方法.

  • 单身人士不仅仅是一个光荣的全球化.想想`NSUserDefaults`,`NSFileManager`等等.如果全局可以作为共享资源实现,因为它对应用程序来说是真正的原子,那么单例将比在任何地方传递相同的对象更好地工作以维护上下文. (2认同)

Jon*_*pan 15

别.全局变量通常是设计不佳的标志.Objective-C中的常见替换是返回对象(可能是也可能不是单例)的类方法,例如[NSUserDefaults standardUserDefaults][UIDevice currentDevice].

但是,如果必须使用全局变量,请继续阅读.

在你的标题中:

extern NSString *someString;
extern NSInteger someInteger;
Run Code Online (Sandbox Code Playgroud)

在您的实现文件中:

NSString *someString = @"DEFAULT_VALUE";
NSInteger someInteger = DEFAULT_VALUE;
Run Code Online (Sandbox Code Playgroud)