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を書くと思います:のように

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

Appleはコーダーで参照チェックを有効にしているため、クラスの名前とクラスタイプだけを書き込みます。これにより、同じオブジェクトが2回エンコードされることはありません。そうしないと、同じオブジェクトのencodeWithCoderが何度も呼び出されます。

したがって、クラスのデータを保存するには、必要なプロパティ/変数をエンコーダーにエンコードする必要があります。

于 2012-08-06T10:11:59.113 に答える
0

NSCodingプロトコルに関するAppleのドキュメントからの抜粋を次に示します。オブジェクト指向の設計原則に従って、エンコードまたはデコードされるオブジェクトは、そのインスタンス変数のエンコードとデコードを担当します。NSCodingで全文を読むことができます。

サンプルスニペットについては、後者に従う必要があります。また、GamePlayStatsクラスと
GameStatsクラスも、NSCodingプロトコルに準拠する必要がありました。

于 2012-08-06T10:10:41.803 に答える