在阅读此博客时,作者说
NSArray *array = @[ @"one", @"two" ];
如果上面的数组是一个全局变量,那么它就会出错。原因是
这是因为 @[] 语法从字面上翻译为对 NSArray 方法的调用。编译器无法在编译时计算该方法的结果,因此在这种情况下它不是合法的初始化程序。
我的问题是方法中的相同声明如何有效?
在阅读此博客时,作者说
NSArray *array = @[ @"one", @"two" ];
如果上面的数组是一个全局变量,那么它就会出错。原因是
这是因为 @[] 语法从字面上翻译为对 NSArray 方法的调用。编译器无法在编译时计算该方法的结果,因此在这种情况下它不是合法的初始化程序。
我的问题是方法中的相同声明如何有效?
数组字面量语法被翻译为:
NSString *vals[2] = { @"one", @"two" };
[NSArray arrayWithObjects:vals count:2];
全局变量和静态变量只能使用编译时常量进行初始化。以上不是编译时间常数。它只能在运行时进行评估。
常规变量可以在运行时初始化,因此该值不需要是编译时常量。
静态或全局的一种选择是initialize
在类的方法中对其进行初始化:
static NSArray *array = nil;
+ (void)initialize {
if (self == [ThisClass class]) {
array = @[ @"one", @"two", nil];
}
}
我不完全确定,但我猜想虽然全局变量必须能够在编译时初始化,因此编译器必须能够计算它,但方法内部的变量直到运行时才会计算,因此可以使用该语法。