我对如何继续这里感到有点困惑,说这是我的班级
@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..
}
为什么会出现这种情况?
欢呼声
答案 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协议。