您认为在objective-c中存储常量(如属性列表的文件名)的最佳做法是什么?
我想在以下代码中改进硬编码的“Config.plist”:
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *rows = [[NSDictionary alloc]initWithContentsOfFile:plistPath];
答案 0 :(得分:2)
最好的解决方案通常是将这种逻辑转移到像MYConfiguration
这样的模型对象中。这样,您可以使用显式方法查询MYConfiguration
,并且永远不会直接访问NSDictionary
。
关于该文件的名称,有很多方法可以抽象它,具体取决于你真正需要多少重用(这里有可能过分重复)。
首先是常数。在MYConfiguration.m
中,您可以像这样放置一个私有常量:
static NSString * const kConfigurationFileBaseName = @"Config";
您还可以使用返回路径的方法:
- (NSString *)pathToConfigurationFile {
return [[NSBundle mainBundle] pathForResource:kConfigurationFileBaseName ofType:@"plist"];
}
直接在pathToConfigurationFile
中对文件名进行硬编码而不是使用常量并不罕见。仅在值被多次使用的情况下才需要常量常量。如果给定的常量只出现一次,那么将值移到别处有时会使代码更难理解。这些只是指南,而不是规则。
如果您需要将常量本身公开,那么您可以在MYConfiguration.h
中以这种方式声明:
extern NSString * const kMYConfigurationFileBaseName;
然后在.m:
中定义它NSString * const kMYConfigurationFileBaseName = @"Config";
但是所有这一切的关键是你在与常量的使用相关的标题中定义这些常量。你不会为所有事情创造一些中心“MYGlobals”倾销场。
答案 1 :(得分:0)
您可以使用NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:(id) forKey:(NSString *)];
[[NSUserDefaults standardUserDefaults] synchronize];
处理NSDictionary
等对象时,您可能需要将其转换为NSData
的实例。这可以通过以下方法完成:
[NSKeyedArchiver archivedDataWithRootObject:(id)];
和
[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)];
分别