6

我有这段代码(来自较大部分的一小部分 - 只是这里显示的麻烦部分):

#define kSizeLarge @"large"

-(void)determineBestFileSizeWithLimit:(int)limit
{
    static NSString *largeName = kSizeLarge;
    static NSArray *nameArray = @[kSizeLarge];
    ...
}

编译器喜欢第一个静态变量,讨厌第二个,说

Initializer element is not a compile-time constant

从第二行删除静态使编译器高兴。

我/我做错了什么或没有正确?

4

2 回答 2

8

当您的静态变量的初始化器不是编译时常量时,您需要使用另一种初始化机制,例如dispatch_once

-(void)determineBestFileSizeWithLimit:(int)limit {
    static NSString *largeName = kSizeLarge;
    static NSArray *nameArray = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        nameArray = @[kSizeLarge];
    });
}
于 2012-10-30T14:43:28.850 回答
4

NSArray文字不是您发现的编译时常量。您应该使用dispatch_once来初始化数组。

#define kSizeLarge @"large"

-(void)determineBestFileSizeWithLimit:(int)limit
{
    static NSString *largeName = kSizeLarge;
    static NSArray *nameArray = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        nameArray = @[kSizeLarge];
    });
    ...
}
于 2012-10-30T14:43:19.400 回答