如何使用字符串文字创建NSArray?

Kyl*_*yle 30 iphone macos objective-c

我正在尝试使用一组字符串文字创建一个NSArray,但是我收到编译错误"Initializer element is not constant".

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];
Run Code Online (Sandbox Code Playgroud)

有人可以指出我做错了什么,并可能解释错误信息?

mal*_*hal 70

使用字符串文字创建数组的新语法:

NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"];
Run Code Online (Sandbox Code Playgroud)

要修复复杂性错误,代码必须在方法中.如果要静态使用它,则创建一个遵循单例模式的类方法.


Chu*_*uck 18

这对NSArray创建本身来说不是问题(如果你写的话,你会得到同样的错误[NSArray array]),但是你写的是它.我猜这是一个全局或文件静态的NSArray.在C中,这种变量必须有一个常量初始化器 - 意味着不是函数调用(或者,通过扩展,方法调用).解决方案是将数组的实际创建和赋值放入一个在需要数组之前调用的方法,例如initialize.


jle*_*ehr 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;
}
Run Code Online (Sandbox Code Playgroud)