AppSettings是一个简单的工具,允许自动将对象序列化和反序列化到NSDictionary,并通过NSUserDefaults进行读写。最初是为了简单地管理NSUserDefaults中的应用设置而创建的。
当您想要将自定义对象持久化到例如NSUserDefaults时,您必须使用NSCoding和NSKeyedArchiver来序列化它。这并不困难,但很耗时,Xcode也没有通过生成一些默认编码和解码方法存根来使这个过程更容易。当您必须手动序列化所有属性时,这变得非常痛苦。
另一方面,使用模型对象来配置您的应用设置,而不是只在NSUserDefaults的键下写值,是非常方便的。您可以使用代码补全,编译器在您输入拼写错误时警告您,而且您不需要记住自定义字典中的所有键字符串。
那么为什么不编写一个序列化器,将具有属性的自定义对象转换为NSDictionary并将其存储在类名键下呢?AppSettings正是这样做的!:)
您需要做的事情只是创建自己的类,从AppSettings继承。您想保存的字段必须在您的.h文件中以属性(@property)的形式声明,就像在其他对象中一样。当您完成并进行对象准备就绪后,您调用save以持久化您的对象。当您想要加载之前保存的对象时,您调用- (id)load,它返回AppSettings子类的实例。就这样!:)
AppSettings继承#import "AppSettings.h"
#import "MyNestedSettings.h"
@interface MySettings : AppSettings
@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;
@endMySettings *mySettings = [[MySettings alloc] init];
mySettings.exampleDate = [NSDate date];[mySettings save];MySettings *mySettings = [MySettings load];您的设置在MySettings键下保存,并且看起来像这样
MySettings = {
exampleBool = 1;
exampleDate = "2013-12-08 11:26:56 +0000";
exampleInt = 456;
exampleNumber = 123;
exampleString = "Example string \U0105\U0119\U015b\U0107";
};
您可以在AppSettings类中实现的接口中尝试其他方法
- (id)initWithDictionary:(NSDictionary*)dictionaryOfPropertiesAndValues;
- (NSArray*)propertiesNames;
- (NSDictionary*)dictionaryOfPropertiesAndValues;
- (BOOL)save;
- (BOOL)saveUnderKey:(NSString*)mainKey;
+ (id)load;
+ (id)loadFromKey:(NSString*)mainKey;例如,您可以提取属性和值的字典并自行处理,或者在不同键下保存设置。
您还可以查看AppSettingsTests.m文件,查看每个方法是如何操作的。
是的,您可以拥有嵌套对象。只需将它们也声明为 AppSettings 的子类,并在您的设置主类中使用作为属性。请参阅测试部分中的 MySettings.h 和 MyNestedSettings.h 文件。
#import "AppSettings.h"
#import "MyNestedSettings.h"
@interface MySettings : AppSettings
@property (nonatomic, strong) NSDate *exampleDate;
@property (nonatomic, strong) NSString *exampleString;
@property (nonatomic, strong) NSNumber *exampleNumber;
@property (nonatomic, assign) int exampleInt;
@property (nonatomic, assign) BOOL exampleBool;
@property (nonatomic, strong) MyNestedSettings *myNestedSettings;
@end#import "AppSettings.h"
@interface MyNestedSettings : AppSettings
@property (nonatomic, strong) NSString *nestedSettingsString;
@end您保存的具有嵌套对象的设置现在看起来类似这样
MySettings = {
exampleBool = 1;
exampleDate = "2013-12-08 11:26:56 +0000";
exampleInt = 456;
exampleNumber = 123;
exampleString = "Example string \U0105\U0119\U015b\U0107";
myNestedSettings = {
nestedSettingsString = "nested example string";
};
};
<objc/runtime.h> 来提取属性信息,并使用 KVC 来设置和获取它们的值。AppSettings 在 MIT 许可下可用。更多信息请参阅 LICENSE 文件。