Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c &引用;初始值设定项元素不是编译时常量;为什么?_Objective C_Ios_Xcode - Fatal编程技术网

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 > /Cord>函数中的变量必须用编译时常数初始化,而C++和ObjuleC++更宽松,允许非编译时间常数。 要么将代码编译为Objective-C++,要么将其重构为如下内容:

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
关键字显式添加到函数体中的变量中(但这必须相当于在全局范围内有一个变量,如该问题所述)。