2012-08-06 64 views
1

我来,我应该如何着手这里有点糊涂了,说这是我的课保存类NSUserDefaults的在objc与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.. 
} 

是否有这样的原因?

欢呼声

+0

不知道你是否犯了一个错字或什么,但你不会写如:self._ivarname。用自己来调用某些东西。假设你正在访问一个属性,“_”前缀通常用于伊娃尔名称而不是属性名称。 – 2012-08-06 10:13:43

回答

1

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

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

会写什么,但你的类的名称和类型,因为苹果已启用参考在编码器检查,也不会编码相同的对象两次。否则,多次调用同一对象上的encodeWithCoder。

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

0

下面是来自苹果公司的上NSCoding协议文档的提取物:与面向对象的设计原理一致,对象正被编码或解码是负责编码和解码它的实例变量。您可以阅读NSCoding的全文。

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