我正在尝试创建一个带有字符串文字分组的NSArray,但是我收到编译错误“Initializer element is not constant”。
NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];
有人可以指出我做错了什么,并可能解释错误信息吗?
答案 0 :(得分:69)
使用字符串文字创建数组的新语法:
NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"];
要修复复杂性错误,代码必须在方法中。如果要静态使用它,则创建一个遵循单例模式的类方法。
答案 1 :(得分:18)
这对NSArray创建本身来说不是问题(如果你写了[NSArray array]
,你会得到同样的错误),但是你写了它的位置。我猜这是一个全局或文件静态的NSArray。在C中,这种变量必须有一个常量初始化器 - 意味着不是函数调用(或者,通过扩展,方法调用)。解决方案是将数组的实际创建和赋值放入一个在需要数组之前调用的方法,例如initialize
。
答案 2 :(得分:7)
听起来Chuck发现了这个问题。在编写解决方案时,您要注意的一件事是,您要避免将自动释放的NSArray实例存储在静态变量中。此外,这些情况的一个常见模式是编写一个类方法,该方法创建并返回存储在静态变量中的值,如下所示:
+ (NSArray *)currencies
{
static NSArray *_currencies;
// This will only be true the first time the method is called...
//
if (_currencies == nil)
{
_currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil];
}
return _currencies;
}
答案 3 :(得分:3)
虽然这已经过时了,但请注意Apple为llvm项目提交了一个新补丁,增加了对NSArray
,NSDictionary
和NSNumber
的新Objective-C文字语法的支持。
答案 4 :(得分:2)
我是objective-c的新手,但我认为正确的代码是:
NSArray * currency = [[NSArray alloc] initWithObjects:@“Dollar”,@“Euro”,@“Pound”,nil];
我不确定。
答案 5 :(得分:0)
该代码没有任何问题。你确定该行正在产生错误吗?