我正在编写以下代码,它会产生以下错误
@implementation ViewController
NSArray *myArray = [[NSArray alloc]initWithObjects:@"paul",@"cyrus",@"victor",nil ];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
我在声明“myArray”的行上得到“初始化元素不是编译时常量”..
请注意,我正在“.m”文件中初始化数组,而不是“.h”文件。
答案 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"];
因为这个数组及其元素不难创建,你应该:
如果 创建起来非常昂贵,那么您可能会喜欢这种形式:
// requires Objective-C++
static NSArray * Names() {
static NSArray * const arr = @[@"paul",@"cyrus",@"victor"];
return arr;
}
因为在你需要它之前不会构建它。全局初始化可能非常有问题。
答案 2 :(得分:0)
将myArray设为ivar并在适当的位置初始化,或在类中创建静态全局并在“initialize”类方法中初始化它。