代码之家  ›  专栏  ›  技术社区  ›  adranale

目标C:使用静态方法调用初始化静态变量

  •  2
  • adranale  · 技术社区  · 16 年前

    当我试图通过调用静态方法(定义中带有+)初始化方法中的静态变量时,编译器声明了一个错误:“initializer元素不是常量”。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Yuji    16 年前

    你不能在Objective-C中这样做。

    1. 切换到ObjuleC++。将文件扩展名从 .m .mm .
    2. 初始化为 nil

      static NSString*foo=nil;
      if(!foo){
            foo=[ ... ] ;
      }
      
        2
  •  4
  •   Quinn Taylor    16 年前

    实际上,除了玉吉的解决方案之外,还有另一个解决方案。您可以创建一个函数,并使用GCC属性(也适用于Clang和LLVM)作为它的前缀,该属性将使它在之前执行 main() 是。我已经多次使用这种方法,它看起来像这样:

    static NSString *foo;
    
    __attribute__((constructor)) initializeFoo() {
        foo = ...;
    }
    

    当你真正使用 foo ,它将已初始化。这意味着你不必检查 nil 每次(这当然是一个较小的性能优势,虽然乘以您使用它的次数,但它也可以简化一个或多个其他代码区域。例如,如果在N个不同的位置引用静态变量,则可能需要检查 否则就有撞车的危险。通常,人们调用函数或使用 #define 处理初始化,如果该代码只实际使用了一次,那么这可能是一个值得删除的惩罚。