编译器声称错误说:“初始化元素不是常量”,当我尝试通过调用静态方法(在其定义中使用+)初始化方法内的静态变量时。 无论如何,我可以告诉他这个方法总是返回相同的值。我知道这与静态方法不同,但是在Objective-C中似乎没有常量方法(除了宏之外,因为我从方法内部调用了UI_USER_INTERFACE_IDIOM(),因此无法在这里工作)。
答案 0 :(得分:4)
除了Yuji之外,实际上还有另一种解决方案。您可以创建一个函数,并在其前面加上GCC属性(也适用于Clang和LLVM),这将导致它在main()
之前执行。我已经多次使用过这种方法,它看起来像这样:
static NSString *foo;
__attribute__((constructor)) initializeFoo() {
foo = ...;
}
当您实际使用foo
时,它已经初始化。这意味着您不必每次都检查它是否为nil
。 (这当然是一个小的性能优势,但乘以你使用它的次数,但它也可以简化一个或多个其他代码区域。例如,如果你在N个不同的地方引用静态变量,你可能有检查所有N中的nil
或冒着崩溃的风险。通常,人们调用函数或使用#define
来处理初始化,如果该代码实际只使用一次,则可能是惩罚除去。
答案 1 :(得分:1)
你不能在Objective-C中这样做。
有两种解决方案:
.m
更改为.mm
。使用nil
对其进行初始化,并在首次使用时进行检查,如下所示:
static NSString*foo=nil;
if(!foo){
foo=[ ... ] ;
}