我应该如何在Objective-C项目中声明一个全局变量?
答案 0 :(得分:25)
传统上,全局变量在标头中声明,在源文件中定义。其他源文件只需要知道如何声明它使用它(即它的类型和名称)。只要变量在源文件中的某处定义,链接器就能够找到它并将其他源文件中的所有引用适当地链接到定义。
在标题的某处,您将声明一个如下全局变量:
extern int GlobalInt;
extern
部分告诉编译器这只是一个声明,即int
标识的GlobalInt
类型的对象存在。它可以在以后定义,也可以不定义(编译器不负责确保它存在,这是链接器的工作)。在这方面它类似于函数原型。
在源文件的一个中,定义GlobalInt
整数:
int GlobalInt = 4;
现在,包含标头的每个文件都可以访问GlobalInt
,因为标头说它存在,所以编译器很高兴,链接器会在你的一个源文件中看到它,所以它也是会很开心只是不要定义它两次!
您应该考虑这种方法是否有用。全局变量由于多种原因而变得混乱(试图找出确切定义或声明的位置,线程问题),通常不需要全局变量。你应该考虑使用单例方法。
答案 1 :(得分:12)
不要。全局变量通常是设计不佳的标志。 Objective-C中的常见替换是返回对象(可能是也可能不是单例)的类方法,例如[NSUserDefaults standardUserDefaults]
或[UIDevice currentDevice]
。
但是,如果必须使用全局变量,请继续阅读。
在标题中:
extern NSString *someString;
extern NSInteger someInteger;
在您的实施文件中:
NSString *someString = @"DEFAULT_VALUE";
NSInteger someInteger = DEFAULT_VALUE;
答案 2 :(得分:2)
根据我的经验,当程序不需要至少可以在整个程序中访问的某种数据或实用程序/辅助方法时,很少有实例。
他们处理这个问题,而不是使用全局变量来创建我称之为“项目应用程序”的东西,它本质上只是一个带有一堆静态方法的类。
它可以通过多种方式实现,但我使用单例并且只需要将静态方法调用到设备类的单个实例。例如,在我的Oovium项目中,我有:
Oovium.h:
@interface Oovium : NSObject {
UIWindow* _window;
}
+ (UIWindow*) window;
Oovium.m:
@implementation Oovium
static Oovium* oovium;
- (UIWindow*) window {return _window;}
+ (void) initialize {
oovium = [[Oovium alloc] init];
}
+ (UIWindow*) window {return [oovium window];}
然后我将Oovium.h包含在我的Oovium_Prefix.pch文件中,以便它自动包含在我的所有文件中。
答案 3 :(得分:-2)
Globals摇滚!我不知道每个人都害怕什么。我在这里成功使用了它们。
Passing Data between View Controllers
还使用UIStepper调整另一个viewController中的值。 我可以看到它们是一个问题是更大的程序,在我看来,单身的东西只是一个蒙面全球。如果您的应用很简单,请保持简单。