首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取"element not a compile-time“常量错误

获取"element not a compile-time“常量错误
EN

Stack Overflow用户
提问于 2012-08-22 03:09:17
回答 3查看 1.2K关注 0票数 0

我正在写下面这段代码,它给出了以下错误

代码语言:javascript
复制
@implementation ViewController
NSArray *myArray = [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil ];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
 }

我在声明了“myArray”的行上得到了“初始化元素而不是编译时常量”。

请注意,我是在".m“文件而不是".h”文件中初始化数组的。

EN

回答 3

Stack Overflow用户

发布于 2012-08-22 03:20:38

如果初始化全局变量或静态变量,则必须使用编译时常量。基本上,编译器必须将该值写入目标文件。您的代码正在发送多条消息,这只能在运行时完成。

如果这真的必须是一个全局变量,你必须用某种方法来初始化它。+initialize通常用来做这样的事情。

票数 1
EN

Stack Overflow用户

发布于 2012-08-22 03:31:29

如前所述,您已经声明了一个全局变量。

您可以使用一个简单的函数来代替:

代码语言:javascript
复制
static NSArray * NamesArray() {
  return [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil];
}

这可能不是您想要的,完全没有必要创建全局NSArray,但如果您正在将源代码编译为Objective-C++,那么实际上您可以使用容器文字表达式来初始化全局‘re:

代码语言:javascript
复制
// requires Objective-C++
static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];

由于创建此数组及其元素并不困难,因此您应该:

  • 只需使用函数
  • 或ivar,如果您需要经常缓存和访问它

如果创建它的成本真的很高,那么您可能更喜欢这种形式:

代码语言:javascript
复制
// requires Objective-C++
static NSArray * Names() {
    static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];
    return arr;
}

因为在您需要它之前,它是不会被构造的。全局初始化可能是非常有问题的。

票数 1
EN

Stack Overflow用户

发布于 2012-08-22 03:14:18

让myArray成为一个ivar并在适当的地方初始化它,或者在你的类中创建一个静态全局并在" initialize“类方法中初始化它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12061435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档