加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – “初始化器元素不是编译时常量”为什么?

发布时间:2020-12-14 20:06:25 所属栏目:百科 来源:网络整理
导读:我有这个代码: - (NSString *) calculate: (uint) position { static NSArray * localArray = [NSArray arrayWithArray: self.container.objects ]; // some un related code return obj;} 编译器抱怨说:“初始化器元素不是编译时常量”.当我将“static”
我有这个代码:

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

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

解决方法

因为[NSArray arrayWithArray:self.container.objects]不是编译时常量,它是一个必须在运行时进行评估的表达式.在C和Objective-C中,函数内部的静态变量必须使用编译时常量进行初始化,而C和Objective-C更宽松,并允许非编译时常量.

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

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

这与编译器在使用非编译时常量初始化的静态变量下生成的代码非常相似(实际上,它将使用第二个全局标志来指示该值是否已初始化,而不是使用在这里的哨兵值为nil;在这种情况下,我们假设localArray永远不会为零).如果需要,可以查看编译器的反汇编.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读