使用 NSCoding 编码、解码和编辑 NSMutableArray

Encoding, decoding, and editing a NSMutableArray with NSCoding

我遵循了 Ray Wenderlich 关于使用单例和 NSCoding 保存游戏数据的教程 (http://www.raywenderlich.com/63235/how-to-save-your-game-data-tutorial-part-1-of-2)。他们所做的一切我都能够用于 NSStrings(更改值、存储、在我的项目中使用)。我试图制作一个 NSMutableArray,这样我就可以添加和保存一个字符串列表,但它没有用。可能有一个非常简单的解决方案,所以在此先感谢您容忍新手。

我的代码:

in RWGameData.h(我使用游戏数据的单例):

@property (nonatomic, strong) NSMutableArray *dataArray;

在RWGameData.m中,在@implementation之后:

static NSString* const GameDataArrayofValues = @"dataArray";

-(void)encodeWithCoder:(NSCoder *)encoder {
  [encoder encodeObject:self.dataArray forKey:GameDataArrayofValues];
}

-(instancetype)initWithCoder:(NSCoder *)decoder {
  self = [self init];
  if (self) {
    _dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
  }
  return self;
}

(还有该教程中的所有其他代码,例如保存方法等)

在myGame.m

[[RWGameData sharedGameData].dataArray addObject:@"objectString"];
[[RWGameData sharedGameData] save];

在此之后立即记录数组的内容显示它为空。 [RWGameData sharedGameData].dataArray 接受了 addObject 调用,因为我将它创建为 NSMutableArray,但它似乎并没有真正通过。

有什么想法吗?

我猜 _dataArray 是 nil。

您应该向 initWithCoder 添加代码以检查它是否能够读取数组数据。如果不是,_dataArray 将为零。在那种情况下,您应该初始化一个空的可变数组。

更新后的 initWithCoder 可能如下所示:

-(instancetype)initWithCoder:(NSCoder *)decoder {
  self = [self init];
  if (self) 
  {
    _dataArray = [[decoder decodeObjectForKey:GameDataArrayofValues] mutableCopy];
    if (_dataArray)
      _dataArray = [[NSMutableArray alloc] init];
  }
  return self;
}

同样,您需要实现 "regular" init 方法,将 _dataArray 设置为一个空的可变数组。