使用NSCoding将类保存到objc中的NSUserDefaults

时间:2012-08-06 09:32:23

标签: objective-c ios nsuserdefaults nscoding

我对如何继续这里感到有点困惑,说这是我的班级

@interface PlayerStats : NSObject <NSCoding>
{
    NSMutableDictionary *gameStats;
    NSUserDefaults *prefs;

    GamePlayStats *_gamePlayStats;

    GameStats *_openGameStats;
    GameStats *_duelGameStats;
    GameStats *_challengeGameStats;

    float _averagePanelsRevealed;
    float _averageGuessSpeed;

    int _totalCoinsEarned;
    int _totalTokensEarned;

    int _playerLevel;
}

现在当我想要保存这个类时我希望这样做,因为它似乎更加明智地保存类,当我得到它时我可以调用它的变量,虽然它的方法等等。

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:self forKey:@"playerStats"];
}

但是我看到的所有例子都要求你单独加载所有变量,所以它应该更像是

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:self.gamePlayStats forKey:@"gamplaystats"];
    [encoder encodeObject:self._openGameStats forKey:@"openGameStats"];
    etc..
}

为什么会出现这种情况?

欢呼声

2 个答案:

答案 0 :(得分:1)

函数 - (void)encodeWithCoder:(NSCoder *)编码器要求您决定要将哪个变量保存到编码器。信息编码器为您生成的是班级信息。在[encoder encodeObject:aObject forKey:@“key”]里面,它会尝试调用[aObject encodeWithCoder:encoder]。我想如果写encodeWithCoder:喜欢

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:self forKey:@"playerStats"];
}

除了你的类的名称和类类型之外什么都不写,因为apple已经启用了编码器中的引用检查,它不会对同一个对象进行两次编码。否则,同一对象上的encodeWithCoder将被多次调用。

因此,您必须将必要的属性/变量编码到编码器中以保存类的数据。

答案 1 :(得分:0)

以下是Apple的NSCoding协议文档的摘录:为了与面向对象的设计原则保持一致,正在编码或解码的对象负责编码和解码其实例变量。您可以阅读NSCoding上的全文。

对于您的示例代码段,您需要遵循后者。另外,GamePlayStats和
GameStats类也需要符合NSCoding协议。