【问题标题】:Objective C - Static class variable of type NSArrayObjective C - NSArray 类型的静态类变量
【发布时间】:2017-06-18 10:57:30
【问题描述】:

我将我的类的一些默认初始值设定项值存储为静态类变量。像这样:

// List.h
static NSString *DEFAULT_LIST_NAME = @"Not Set";
static BOOL DEFAULT_RECURSION = NO;

我还需要将NSArray * 类型的静态变量设置为空数组。如何做到这一点?目前我收到错误:

Initializer 元素不是编译时常量

【问题讨论】:

  • 您好 这个问题和你的类似。有不同的方法可以做到这一点。也许你想检查一下:stackoverflow.com/questions/20544616/…
  • @SamB 我为什么要这样做?
  • 显示错误截图。如果我使用上面的静态代码行,我的 Xcode 8 中不会出现任何编译警告或错误

标签: ios objective-c arrays static nsarray


【解决方案1】:

您收到编译时错误"Initializer element is not a compile-time constant",因为静态变量的值实际上是在编译时写入您的可执行文件的。所以你只能使用常量值(不是在运行时执行的 alloc/init)。您可以使用以下任何选项

  1. 您可以编写 static NSArray *arr = nil 并使用 +initialize 创建您的数组。

  2. 另一个选项是你可以使用__attribute__ ((constructor))

  3. 另一个选择是将源文件的类型从 Objective-C 切换到 Objective-C++(或将其从 .m 重命名为 .mm,效果相同)。在 C++ 中,这样的初始化器不需要是编译时常量值,原始代码可以正常工作

  4. 您也可以使用 Pat_Morita 给出的解决方案

【讨论】:

    【解决方案2】:

    为此定义一个类方法:

    .m 文件

    @implementation test
    static NSArray *array; 
    + (NSArray *)array { 
        if (!array) array = [[NSArray alloc] init]; 
        return array;
     } 
    @end
    

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2010-11-06
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多