2012-08-06 112 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協議。