web-dev-qa-db-ja.com

NSCoderを使用してNSArrayまたはNSDictionaryをエンコードします

NSCoderメソッドを使用できるかどうか疑問に思いました。

- (void)encodeObject:(id)objv forKey:(NSString *)key

nSArrayまたはNSDictionaryのインスタンスをエンコードします。そうでない場合は、どのようにエンコードしますか? NSKeyedArchived/NSKeyedUnarchiverを使用して、GameKitを使用して電話間でデータを送信しようとしています。試しましたが、配列に保存した文字列を取得できないようです。私が作成したパケットクラスは、パケットタイプ整数と一緒に渡されますが、配列内のデータではないようです。

前もって感謝します!

18
Ron Dear

NSKeyedArchiver/Unarchiverは、NSArrayとNSDictionariesを問題なくエンコードおよびデコードする必要があります。作成したパケットクラスがNSCodingプロトコルを実装している場合は、[encodeObject:メソッドでforKey:@"stringsArray"]myNsArray-encodeWithCoder:を明示的に呼び出す必要があります( myNsArrayが、エンコードするパケットオブジェクトのインスタンス変数の名前であると想定します)。ただし、アーカイバとNSArrayが残りの処理を行う必要があります。これを行う場合は、クラスのレイアウトと、エンコード/デコード時に誰が誰を呼び出しているかについて詳しく聞くと役立ちます。

10
Ben Zotto

配列または辞書がルートオブジェクトである場合は、次のことを行う必要があります

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

または

BOOL success = [NSKeyedArchiver archiveRootObject:someArray toFile:filePath];

カスタムクラスのインスタンス変数の場合は、-encodeWithCoder:メソッドは行う必要があります

[coder encodeObject:someArray forKey:@"someArray"];

そして-initWithCoder: 方法

someArray = [[coder decodeObjectForKey:@"someArray"] retain];
32
Cory Kilger

配列にはどのようなオブジェクトを格納していますか?配列に格納されているすべてのオブジェクトがNSCodingプロトコルを実装していることを確認してください。

21
Ole Begemann