使用NSCoding对NSMutableArray进行编码,解码和编辑

时间:2015-03-07 21:08:48

标签: ios objective-c nsmutablearray nscoding

我跟随Ray Wenderlich的教程,使用单例和NSCoding(http://www.raywenderlich.com/63235/how-to-save-your-game-data-tutorial-part-1-of-2)来保存游戏数据。他们所做的一切我已经能够用于NSStrings(改变价值,存储,在我的项目中使用)。我尝试创建一个NSMutableArray,所以我可以添加并保存一个字符串列表,但它没有用。可能有一个非常简单的解决方案,所以提前感谢你忍受一个新手。

我的代码:

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,但似乎它实际上并未实现。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我猜是_dataArray是零。

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

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

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

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