草庐IT

objective-c - "Initializer element is not a compile-time constant"为什么?

coder 2023-07-27 原文

我有这个代码:

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

编译器提示说:“Initializer element is not a compile-time constant”。当我将“静态”添加到 localArray 时发生了这种情况。但是为什么?

最佳答案

因为 [NSArray arrayWithArray: self.container.objects ] 不是编译时常量,它是一个必须在运行时计算的表达式。在 C 和 Objective-C 中,函数内的 static 变量必须用编译时常量初始化,而 C++ 和 Objective-C++ 更宽松,允许非编译时常量。

要么将您的代码编译为 Objective-C++,要么将其重构为如下形式:

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

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

关于objective-c - "Initializer element is not a compile-time constant"为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304740/

有关objective-c - "Initializer element is not a compile-time constant"为什么?的更多相关文章

随机推荐