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

时间:2010-05-11 14:48:18

标签: objective-c xcode iphone

编译器声称错误说:“初始化元素不是常量”,当我尝试通过调用静态方法(在其定义中使用+)初始化方法内的静态变量时。 无论如何,我可以告诉他这个方法总是返回相同的值。我知道这与静态方法不同,但是在Objective-C中似乎没有常量方法(除了宏之外,因为我从方法内部调用了UI_USER_INTERFACE_IDIOM(),因此无法在这里工作)。

2 个答案:

答案 0 :(得分:4)

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

static NSString *foo;

__attribute__((constructor)) initializeFoo() {
    foo = ...;
}

当您实际使用foo时,它已经初始化。这意味着您不必每次都检查它是否为nil。 (这当然是一个小的性能优势,但乘以你使用它的次数,但它也可以简化一个或多个其他代码区域。例如,如果你在N个不同的地方引用静态变量,你可能有检查所有N中的nil或冒着崩溃的风险。通常,人们调用函数或使用#define来处理初始化,如果该代码实际只使用一次,则可能是惩罚除去。

答案 1 :(得分:1)

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

有两种解决方案:

  1. 切换到Objective-C ++。将文件扩展名从.m更改为.mm
  2. 使用nil对其进行初始化,并在首次使用时进行检查,如下所示:

    static NSString*foo=nil;
    if(!foo){
          foo=[ ... ] ;
    }