在 Objective-C 中,对象只能在堆中分配,因此无法在静态内存中创建 NSArray。但是,您可以创建一个指向 NSString 常量的指针的 C 数组,如下所示......
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
...然后你可以编写像这样的类方法...
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Edit
请注意,随着 ARC、Grand Central Dispatch 和新的数组文字语法等新技术的引入,现在有一种更直接的方法来完成类似的事情。请注意,下面的示例还提供了更高的线程安全性,尽管原始示例可以合并@synchronized
块或其他几种机制之一,以达到类似的结果。
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
然而,上面的例子并没有完全解决最初的问题。如果确实需要全局常量数组,则可以按照与原始答案类似的方式重写前面的示例,同时仍然利用 GCD:
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = [NSArray arrayWithObjects:kLabelNames count:3];
});
return names;
}