“初始化元素不是编译时常量”为什么?

我有这个代码:

- (NSString *) calculate: (uint) position { static NSArray * localArray = [NSArray arrayWithArray: self.container.objects ]; // some un related code return obj; } 

编译器抱怨说:“初始化元素不是编译时常量”。 当我添加“静态”localArray时发生。 但为什么?

因为[NSArray arrayWithArray: self.container.objects ]不是编译时常量,所以它是一个必须在运行时进行评估的expression式。 在C和Objective-C中,函数内部的staticvariables必须用编译时常量来初始化,而C ++和Objective-C ++则更为宽松,并且允许非编译时常量。

或者将你的代码编译为Objective-C ++,或者将其重构为如下所示:

 static NSArray *localArray = nil; if (localArray == nil) localArray = [NSArray arrayWithArray: self.container.objects ]; 

这与编译器在底层为非编译时常量初始化的staticvariables生成的代码非常相似(实际上,它将使用第二个全局标志来指示该值是否已初始化,而不是使用一个像这样的nil localArray值;在这种情况下,我们假设localArray永远不会nil )。 你可以检查你的编译器的反汇编,如果你想。

你只是不能初始化一个静态variables,这个静态variables在运行时会被知道/修改。

你可能应该这样做:

 static NSArray *localArray = nil; localArray = ...; 

第一条指令将在您的应用生命周期中执行一次。 每次调用calculate:方法时,都会执行第二条指令。

不过要注意的一点是,如果使用静态variables可能会导致错误的行为,如果做得不好,所以如果你对这些行为感到不安,你可能不应该使用它们。