0

我正在编写以下代码,它给出以下错误

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

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

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

4

3 回答 3

1

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

您可以改用一个简单的函数:

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

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

// 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;
}

因为在您需要它之前不会构建它。全局初始化可能会有很大的问题。

于 2012-08-21T19:31:29.143 回答
1

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

如果这真的必须是一个全局变量,则必须以某种方法对其进行初始化。+initialize经常用于这样的事情。

于 2012-08-21T19:20:37.553 回答
0

使 myArray 成为 ivar 并在适当的位置对其进行初始化,或者在您的类中创建一个静态全局并在“initialize”类方法中对其进行初始化。

于 2012-08-21T19:14:18.233 回答