3

MyDTO をアーカイブすると、iOS 6 と iOS 7 でアーカイブの値が異なります。
なぜこれが起こるのですか?

MyDTO.h

@property (nonatomic, strong) NSString *aaa;
@property (nonatomic, strong) NSString *bbb;

MyDTO.m

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:_aaa forKey:@"aaa"];
    [encoder encodeObject:_bbb forKey:@"bbb"];
}

マイメソッド

- (void)test {
    MyDTO *myDTO = [[MyDTO alloc] init];
    myDTO.aaa = @"1";
    myDTO.bbb = @"2";

    //data is different in iOS 6 and iOS 7
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myDTO];
}

編集

以下の手順でエラーが発生します。

  1. DTO のアーカイブ (iOS 6)
  2. OSのバージョンアップ (iOS 6 -> iOS 7)
  3. DTO (iOS 7) のアーカイブ解除 <- エラー!

エラーログ

[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x48, 0xfffffff2, 0xffffffd7, 0xffffff89, 0xffffff80, 0xffffffa8, 0x70, 0xffffff8d)

次の手順では正常です。

  1. DTO のアーカイブ (iOS 6)
  2. DTO のアーカイブ (iOS 6)

また

  1. DTO のアーカイブ (iOS 7)
  2. DTO のアーカイブ (iOS 7)

アーカイブの価値が違うからだと思いました。

4

1 に答える 1

0

NSData の代わりに JSON 文字列を転送し、JSON から DTO を初期化するメソッドと、DTO から JSON を作成するメソッドを追加できます。Bluetooth Low Energy 経由でデータを交換するためにこのアプローチを使用していますが、iOS 7 デバイスと iOS 8 デバイス間で正常に動作します。

于 2014-11-04T13:25:09.243 に答える