gpt4 book ai didi

iphone - 如何将 NSArray 用作全局常量?

转载 作者:太空狗 更新时间:2023-10-30 03:22:34 25 4
gpt4 key购买 nike

我正在使用一组 Constant.m 文件(每个目标一个)来为每个目标定义特定内容。例如:

// Constants.h
extern NSString * const kDatabaseFileName;
//Constants.m
NSString * const kDatabaseFileName = @"target_one.sqlite";

我还想为我的每个目标定义一个 NSArray:

NSArray * const kLabelNames = [[NSArray alloc] initWithObjects:
@"nameLabel", @"addressLabel", nil];

但这给出了“错误:初始化元素不是常量”。使用“arrayWithObjects”也不起作用。这是因为我的数组中的字符串不是常量吗?

如何将数组设置为全局常量?谢谢。

最佳答案

在 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;
}

编辑

请注意,随着 ARC、Grand Central Dispatch 和数组的新文字语法等新技术的引入,现在有一种更直接的方法来完成类似的事情。请注意,下面的示例还提供了更高的线程安全性,尽管原始示例可以包含 @synchronized block 或其他几种机制之一,以实现类似的结果。

+ (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;
}

关于iphone - 如何将 NSArray 用作全局常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com