nev*_*ing 11 arrays iphone global constants objective-c
我正在使用一组Constant.m文件,每个目标一个,为每个目标定义特定的东西.例如:
// Constants.h
extern NSString * const kDatabaseFileName;
//Constants.m
NSString * const kDatabaseFileName = @"target_one.sqlite";
Run Code Online (Sandbox Code Playgroud)
我还想为每个目标定义一个NSArray:
NSArray * const kLabelNames = [[NSArray alloc] initWithObjects:
@"nameLabel", @"addressLabel", nil];
Run Code Online (Sandbox Code Playgroud)
但是这给出了"错误:初始化元素不是常数".使用'arrayWithObjects`也不起作用.这是因为我的数组中的字符串不是常量吗?
如何将数组设置为全局常量?谢谢.
jle*_*ehr 28
在Objective-C中,对象只能在堆中分配,因此无法在静态内存中创建NSArray.但是,您可以创建一个指向NSString常量的C数组,如下所示...
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
Run Code Online (Sandbox Code Playgroud)
...然后你可以编写像这样的类方法......
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Run Code Online (Sandbox Code Playgroud)
编辑
请注意,随着ARC,Grand Central Dispatch等新技术的引入以及数组的新文字语法,现在有一种更简单的方法可以实现类似的功能.请注意,下面的示例还提供了更高的线程安全性,尽管原始示例可能包含一个@synchronized块或其他几种机制之一,以实现类似的结果.
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
Run Code Online (Sandbox Code Playgroud)
但是,上述示例并未完全解决原始问题.如果确实需要全局常量数组,前面的示例可以与原始答案类似的行重写,同时仍然利用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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个更简单的方法:
用逗号分隔的元素(或任何你想要的分隔符)声明NSString
NSString *const kLabelNames = @"Foo,Bar,Baz";
Run Code Online (Sandbox Code Playgroud)
然后在需要时转换为NSArray:
NSArray *namesArray = [kLabelNames componentsSeparatedByString:@","];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20105 次 |
| 最近记录: |