Objective c &引用;初始值设定项元素不是编译时常量;为什么?
我有以下代码:Objective c &引用;初始值设定项元素不是编译时常量;为什么?,objective-c,ios,xcode,Objective C,Ios,Xcode,我有以下代码: - (NSString *) calculate: (uint) position { static NSArray * localArray = [NSArray arrayWithArray: self.container.objects ]; // some un related code return obj; } 编译器抱怨说:“初始值设定项元素不是编译时常量”。我在localArray中添加“static”时发生了这种情况。但是为什么呢?因为
- (NSString *) calculate: (uint) position {
static NSArray * localArray = [NSArray arrayWithArray: self.container.objects ];
// some un related code
return obj;
}
编译器抱怨说:“初始值设定项元素不是编译时常量”。我在localArray中添加“static”时发生了这种情况。但是为什么呢?因为
[NSArray arrayWithArray:self.container.objects]
不是编译时常量,而是必须在运行时计算的表达式。C和ObjuleC中,static NSArray *localArray = nil;
if (localArray == nil)
localArray = [NSArray arrayWithArray: self.container.objects ];
static NSArray *localArray = nil;
localArray = ...;
这与编译器在后台为使用非编译时常量初始化的
静态
变量生成的代码非常相似(实际上,它将使用第二个全局标志指示值是否已初始化,而不是在此处使用类似nil
的哨兵值;在这种情况下,我们假设localArray
永远不会是nil
)。如果需要,您可以检查编译器的反汇编。您不能使用运行时已知/修改的非静态值初始化静态变量
您可能应该这样做:
static NSArray *localArray = nil;
if (localArray == nil)
localArray = [NSArray arrayWithArray: self.container.objects ];
static NSArray *localArray = nil;
localArray = ...;
第一条指令将在应用程序生命周期中执行一次。
第二条指令将在每次调用calculate:方法时执行
然而,请注意这样一个事实:如果使用静态变量不当,可能会导致错误行为。因此,如果您对这些变量感到不安,您可能不应该使用它们。我建议使用
dispatch_once()
初始化localArray
。它是线程安全且非常有效的。这是同一个问题。您问题中唯一的特殊之处是将static
关键字显式添加到函数体中的变量中(但这必须相当于在全局范围内有一个变量,如该问题所述)。