【问题标题】:getting the "element not a compile-time" constant error得到“元素不是编译时”常量错误
【发布时间】:2012-08-21 19:09:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      你可以使用一个简单的函数来代替:

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

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

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

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

      【讨论】:

      • 您确定容器字面量适用于全局变量吗?它们只是被转换为构造函数方法调用,AFAIK - 它不像 NSString 编译器知道对象的布局。
      • @W'rkncacnter 谢谢大家+1。我大部分时间都在将 ObjC 编译为 ObjC++。我已经注意到需要 ObjC++ 的地方。
      • 哇,所以它确实适用于 C++?!棒极了。我将不得不对此进行调查。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 2022-01-10
        • 2012-03-22
        • 2013-03-16
        • 2015-12-11
        相关资源
        最近更新 更多