“初始化元素不是编译时常量”为什么?
我有这个代码:
- (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中,函数内部的static
variables必须用编译时常量来初始化,而C ++和Objective-C ++则更为宽松,并且允许非编译时常量。
或者将你的代码编译为Objective-C ++,或者将其重构为如下所示:
static NSArray *localArray = nil; if (localArray == nil) localArray = [NSArray arrayWithArray: self.container.objects ];
这与编译器在底层为非编译时常量初始化的static
variables生成的代码非常相似(实际上,它将使用第二个全局标志来指示该值是否已初始化,而不是使用一个像这样的nil
localArray
值;在这种情况下,我们假设localArray
永远不会nil
)。 你可以检查你的编译器的反汇编,如果你想。
你只是不能初始化一个静态variables,这个静态variables在运行时会被知道/修改。
你可能应该这样做:
static NSArray *localArray = nil; localArray = ...;
第一条指令将在您的应用生命周期中执行一次。 每次调用calculate:方法时,都会执行第二条指令。
不过要注意的一点是,如果使用静态variables可能会导致错误的行为,如果做得不好,所以如果你对这些行为感到不安,你可能不应该使用它们。