得到“元素不是编译时”常量错误

时间:2012-08-21 19:09:17

标签: objective-c

我正在编写以下代码,它会产生以下错误

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

您可以使用简单的功能:

static NSArray * NamesArray() {
  return [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil];
}

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

// requires Objective-C++
static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];

因为这个数组及其元素不难创建,你应该:

  • 只需使用功能
  • 或ivar,如果您需要经常缓存和访问

如果 创建起来非常昂贵,那么您可能会喜欢这种形式:

// requires Objective-C++
static NSArray * Names() {
    static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];
    return arr;
}

因为在你需要它之​​前不会构建它。全局初始化可能非常有问题。

答案 2 :(得分:0)

将myArray设为ivar并在适当的位置初始化,或在类中创建静态全局并在“initialize”类方法中初始化它。