【问题标题】:How do I create an NSArray with string literals?如何使用字符串文字创建 NSArray?
【发布时间】:2010-05-06 16:48:57
【问题描述】:

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

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];

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

【问题讨论】:

  • 您的代码应该可以工作,您确定错误不在其他地方吗?
  • 你应该说出你把那行放在哪里,因为听起来你没有把它放在一个方法中。

标签: iphone objective-c macos


【解决方案1】:

用字符串字面量创建数组的新语法:

NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"];

要修复您的复杂错误,代码必须在方法中。如果你想静态使用它,那么创建一个遵循单例模式的类方法。

【讨论】:

  • 值得注意的是,如果它在方法内部,它将被动态分配数组。我希望它是静态常量数组。
【解决方案2】:

这不是 NSArray 创建本身的问题(如果您改为编写 [NSArray array],您会得到相同的错误),但是您编写它的位置。我猜这是一个全局或文件静态 NSArray。在 C 中,这种变量必须有一个常量初始化器——这意味着不是函数调用(或者,通过扩展,方法调用)。解决方法是将数组的实际创建和赋值放到一个方法中,在需要数组之前调用,比如initialize

【讨论】:

  • 我已经在头文件中声明了这个,但不知道我无法在方法之外初始化它。
  • 把它放在+load里面安全吗?
【解决方案3】:

听起来 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;
}

【讨论】:

  • 您好,为什么不建议将自动释放的对象存储在静态变量中?是为了提高效率,以免在每个循环中都询问他们的保留计数吗?
  • 自动释放池中的对象不会被询问保留计数;当自动释放池被释放时,他们会收到release 消息。如果一个自动释放的对象存储在一个静态变量中,一旦发生这种情况,该变量将包含一个无效地址,并且尝试引用它会使您的程序崩溃,或者更糟糕的是,导致它错误地访问一些已分配的新对象临时地址。
  • 是的,这是真的,文档还指出,如果您保留一个自动释放对象,当池耗尽时,您的对象将不会被释放。如果您使用 appkit,将在每个事件循环上创建一个自动释放池,并在其结束时排出。所以我认为它确实调用了保留计数。
【解决方案4】:

虽然这很旧,但请注意 Apple 已为 llvm 项目提交了一个新补丁,添加了对 NSArrayNSDictionaryNSNumber 的新 Objective-C 文字语法的支持。

herehere

【讨论】:

    【解决方案5】:

    我是objective-c的新手,但我认为正确的代码是:

    NSArray *currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil];

    我不确定。

    【讨论】:

    • 这也是有效的,但是OP的代码没有错。您的方法只是保留了数组,而他的方法没有
    • 但是,如果存储在静态变量中的对象被保留,这是一个潜在的崩溃错误,所以 alloc/init 是正确的做法。
    【解决方案6】:

    该代码没有任何问题。您确定该行正在产生错误吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多