iPhone开发之用存储应用程序设置
[来源] 达内 [编辑] 达内 [时间]2012-09-07
使用 plist 存储应用程序设置的好处是 plist 文件可以用文本编辑器打开编辑,但麻烦的地方就是要写不少代码。而使用 NSData 配合自定义的结构来存储设置就非常简单了。
GameState.h
#import
/** 游戏状态数据
*/
struct GameStateData {
int version; // 状态数据结构的版本
BOOL isSoundsEnabled; // 是否允许音效
};
typedef struct GameStateData GameStateData;
@interface GameState : NSObject {
BOOL _isLoaded;
GameStateData _data;
}
+ (GameState *) sharedState;
- (BOOL) synchronize;
@end
GameState.m
#import "GameState.h"
@implementation GameState
static GameState *_sharedState = nil;
+ (GameState *) sharedState
{
if (!_sharedState) {
_sharedState = [[GameState alloc] init];
}
return _sharedState;
}
- (id) init
{
self = [super init];
if (self) {
_isLoaded = NO;
// 初始化设置
memset(& _data, 0, sizeof(_data));
_data.version = 1;
}
return self;
}
- (BOOL) synchronize
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSData *data = nil;
if (_isLoaded) {
// 写入设置到 defaults
data = [NSData dataWithBytes:& _data length:sizeof(_data)];
[prefs setValue:data forKey:@"gameState"];
return [prefs synchronize];
}
// 从 defaults 读取设置
data = [prefs dataForKey:@"gameState"];
if (!data || [data length] != sizeof(_data)) return NO;
[data getBytes:& _data length:sizeof(_data)];
_isLoaded = YES;
return YES;
}
@end
使用说明:
GameState.h 里面定义的 GameStateData 结构用来存储设置,可以随意扩充,但只能限于基本的 C 语言类型,不能是指针。如果需要存储字符串之类的,可以使用 char[xx] 数组,读取写入前稍微处理一下即可。
应用程序初始化时,执行 [[GameState sharedState] synchronize]。
设置改变后需要保存时,再次执行 [[GameState sharedState] synchronize]。