[url]http://blog.ablepear.com/2009/12/objective-c-tuesdays-global-variables.html[/url]
任何声明在函数或者方法之外的变量都是全局变量:
[b]初始化:[/b]缺省情况下,全局变量初始化为0.对于指针类型(包括C字符串)NULL是默认值;对于Objective-C的对象指针,默认是nil.(这和局部变量不同,局部变量不保证有初始值,因此应该显示初始化.)
一个全局变量能在被定义时赋一个初始值,但有一个限制:初始值必须是编译器在编译时能计算得到值.通常,这意味着你只能使用字面值,像数字,字符和字符串,并且你只能使用基本的算术运算符.下面是一些全局变量初始化的例子:
不幸的是你不能调用函数或者方法或者使用其他的变量给一个全局变量赋初始值.下面是一些非法初始化赋值的例子:
这个限制意味着全局Objective-C对象类型不能在声明时进行初始化:
只有一个例外:NSString全局变量能用Objective-C字符串初始化:
如果你需要对全局变量做一些复杂的初始化,唯一的选择是程序开始的时候显示地初始化.通常有一些地方来做这些工作:
[list]
[*]main()函数的开始
[*]在你应用的代理的-init方法中
[*]在你应用的代理的-applicationDidFinishLaunching:方法中
[*]在你的classes的+initialize 方法中
[/list]
如果一个全局变量与一个特定的类相关,这个类的+initialize 方法是旋转相关代码的好地方.
任何声明在函数或者方法之外的变量都是全局变量:
int count1; // 全局
int main(int argc, char *argv[]) {
int count2; // main()中局部
...
}
[b]初始化:[/b]缺省情况下,全局变量初始化为0.对于指针类型(包括C字符串)NULL是默认值;对于Objective-C的对象指针,默认是nil.(这和局部变量不同,局部变量不保证有初始值,因此应该显示初始化.)
一个全局变量能在被定义时赋一个初始值,但有一个限制:初始值必须是编译器在编译时能计算得到值.通常,这意味着你只能使用字面值,像数字,字符和字符串,并且你只能使用基本的算术运算符.下面是一些全局变量初始化的例子:
int count; // defaults to 0
int daysPerYear = 365;
int secondsPerDay = 24 * 60 * 60;
不幸的是你不能调用函数或者方法或者使用其他的变量给一个全局变量赋初始值.下面是一些非法初始化赋值的例子:
// WARNING: WON'T COMPILE
// ERROR: function call not allowed
size_t titleLength = strlen("Objective-C Tuesdays");
// ERROR: method call not allowed
NSUInteger subtitleLength = [@"global variables" length];
// ERROR: calculation uses other global variables
unsigned long totalLength = titleLength + subtitleLength;
这个限制意味着全局Objective-C对象类型不能在声明时进行初始化:
// WARNING: WON'T COMPILE
NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", nil];
只有一个例外:NSString全局变量能用Objective-C字符串初始化:
NSString *title = @"Objective-C Tuesdays";
如果你需要对全局变量做一些复杂的初始化,唯一的选择是程序开始的时候显示地初始化.通常有一些地方来做这些工作:
[list]
[*]main()函数的开始
[*]在你应用的代理的-init方法中
[*]在你应用的代理的-applicationDidFinishLaunching:方法中
[*]在你的classes的+initialize 方法中
[/list]
如果一个全局变量与一个特定的类相关,这个类的+initialize 方法是旋转相关代码的好地方.