《Objective C类方法load和initialize的区别》里,我介绍了+(void)initialize和+(void)load两个方法在编译和执行时出现的区别,又通过《使用Objective-C的+(void)initialize初始化static变量》一文简单介绍了+(void)initialize可以用在对静态变量的初始化上。
如同《使用Objective-C的+(void)initialize初始化static变量》中介绍的那样,假如Objective-C的全局变量被限定为static,只用在当前文档中,那么使用+(void)initialize
来进行初始化是非常合适而且正确的。如果类并未被使用,该变量就不会被赋予对象也就不会浪费内存空间。但是假如我们就是希望用全局变量在程序任何地方使用,那么+(void)initialize
可能就不那么有效了。因为变量可能在相应类的方法被调用前就使用,即是说+(void)initialize
并未被调用对全局变量进行初始化。
下边就是简单的例子:
[codesyntax lang=”objc” lines=”normal”]
// Head file @interface Printer : NSObject @end extern Printer* printer; // Implementation file #import "Printer.h" Printer* printer; @implementation Printer + (void)initialize { if (!printer) { printer = [[Printer alloc] init]; } } @end int main(int argc, const char * argv[]) { @autoreleasepool NSLog(@"%@", printer); } return 0; }
[/codesyntax]
程序输出的结果是:
(null)
可以看出,printer变量并没有指向任何对象,我们也无法使用它。虽然把变量定义成全局在面向对象编程中并不是一个非常好的编程习惯,但是有时候却又是很便利的事情。
对于全局变量的初始化,我们可以在main里面在所有其它过程执行前进行。但是Objective-C还提供了一个更好的方法,那就是+(void)load
,它甚至是在main方法执行前执行,这也正式我们在这种情况下需要的。
我们把上边的例子改一下,用+(void)load
来替代+(void)initialize
[codesyntax lang=”objc” lines=”normal”]
// Implementation file #import "Printer.h" Printer* printer; @implementation Printer + (void)load { if (!printer) { printer = [[Printer alloc] init]; } } @end int main(int argc, const char * argv[]) { @autoreleasepool NSLog(@"%@", printer); } return 0; }
[/codesyntax]
此时程序输出结果则变成了:
<Printer: 0x7fc701414440>
即表明全局变量得到了正确的初始化。