1

我有点困惑我应该如何在这里进行,说这是我的课

@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..
}

为什么会这样?

干杯

4

2 回答 2

1

函数 - (void)encodeWithCoder:(NSCoder *)encoder 要求您决定要保存到编码器的变量。编码器为您生成的信息是类信息。在 [encoder encodeObject:aObject forKey:@"key"] 内部,它会尝试调用 [aObject encodeWithCoder:encoder]。我想如果写 encodeWithCoder: like

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

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

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

于 2012-08-06T10:11:59.113 回答
0

以下是 Apple 关于 NSCoding 协议的文档的摘录:根据面向对象的设计原则,被编码或解码的对象负责对其实例变量进行编码和解码。您可以阅读NSCoding上的全文。

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

于 2012-08-06T10:10:41.803 回答