< meta http-equiv="description" content="GameState.h 里面定义的 GameStateData 结构用来存储设置,可以随意扩充,但只能限于基本的 C 语言类型,不能是指针。如果需要存储字符串之类的,可以使用 char[xx] 数组,读取写入前稍微处理一下即可 "/>

iPhone开发之用存储应用程序设置

[来源] 达内    [编辑] 达内   [时间]2012-09-07

GameState.h 里面定义的 GameStateData 结构用来存储设置,可以随意扩充,但只能限于基本的 C 语言类型,不能是指针。如果需要存储字符串之类的,可以使用 char[xx] 数组,读取写入前稍微处理一下即可 。

  使用 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]。

资源下载