2017-06-13 4 views
0

私のアプリケーションを64ビットに更新しています。32ビットオブジェクトから64ビットオブジェクトへの変換

すべてのオブジェクトを見てドキュメントに保存することで、ドキュメントを保存します。

32ビットオブジェクト

@interface mySquare : NSObject 
@property int  someInt; 
@property float someFloat; 
@property CGPoint  beginPos; 
@property CGPoint  endPos; 
-(void) applyStrokeTypeAndColor:(CGContextRef)context; 
@end 

どのように私はそれらを読むには

for (MyObjects *obj in self.objects) { 
    [obj archiveTo:file]; 
} 

(抽象的な概念)を保存します(抽象的な概念)

for (int i = 0; i < cnt; i++) { 
    NSString *clsName = [MyObjects objectNameOfData:file]; 

    MyObjects *obj = [NSClassFromString(clsName) new]; 
    [obj readFrom:file]; 
    if (self.targetView == MyView) { 
     [self.objects addObject:obj]; 
    } 

} 

このメソッドはうまくいきます。そして、私が構築したアプリケーションのタイプのために長年にわたって素晴らしい仕事をしてきました。オブジェクトの読み込み、保存、読み込み、正しいクラス型へのキャスト

ファイルが32ビットアプリケーションで作成された場合は、「32ビット」バージョンで開きますが、正常に開きます。

64ビットに更新すると、「64ビット」で作成されたファイルは正常に開きますが、32ビットの方法で作成されたファイルは開かれません。ファイルがロードされ、情報をログアウトすると、各オブジェクトが読み込まれていることがわかりますが、進行中にデータが失われていると想定しています。あなたが上見ることができるように

64ビットオブジェクト

@interface mySquare : NSObject 
@property long  someInt; //was int 
@property CGFloat  someFloat; //was float 
@property CGPoint  beginPos; 
@property CGPoint  endPos; 
-(void) applyStrokeTypeAndColor:(CGContextRef)context; 
@end 

は、64ビットオブジェクトで変更唯一のものは、参照タイプでした。

私は32ビットと64ビットで作成されたファイルを区別する方法を作りました。私はちょうど "myExt2"に変更したので、プログラムはどのバージョンのファイルが作成されたか知っていて、古いバージョンのアプリケーションでも新しい64ビットファイルが見えないようにします。

私は恐れていますが、私は自分のリーグから外れています。

私の32ビットファイルをキャストして(またはアプリケーションで変換して)、私の64ビットプログラムでどのように開くことができますか?レガシーファイルのサポートなしで私のアプリのアップデートを送ることはできません。

+0

古いオブジェクトコード(intとfloat)を使用すると、64ビットアプリケーションで古いファイルが正常に読み込まれる可能性がありますか? – Losiowaty

+0

はい、できます。 int/floatを使用すると、64ビットアプリケーションがそれらを開きます。 @losiowaty –

答えて

0

私たちがコメントから知っているように、64ビットアプリケーションは、32ビットアプリケーションバージョンのコードを使用すると、古いファイルをうまく開きます。私は古いコードを残して、クラスの名前をmySquareOldのように変更することをお勧めします。その後、ユーザーは次の操作を実行し、古いファイルを開こうとするたび:

  1. 古いコード
  2. mySquareOld
  3. mySquareに同じファイルの下に古いファイル
  4. 保存mySquareを削除する変換を使用してデータを読みます名前は新しい構造である。オブジェクトが直列化復元されるとintfloatはそれぞれlongCGFloatにきれいに収まる必要があるため

第二ステップでは、簡単なはずです。

+0

古い32ビットコードを使用してファイルを開く場合、64クラスを開発するのはなぜですか?難しくしようとしていない。私はちょうど理解していない –

+0

アプリが64ビットアーキテクチャでうまくコンパイルされ、徹底的にテストしてすべてがうまくいくと確信していれば、コードの変更を行う必要はないようですアプリの)。 'CGPoint'プロパティの値を' x'と 'y'に' CGFloat'を内部的に使用するので、慎重にテストすることを強くお勧めします。誤解されていなければ、 'CGFloat'は' typedef' 32ビットの 'float'のためのもので、64ビットの' double'の 'typedef'です。 – Losiowaty

+0

ありがとうございます。クラスオブジェクトを 'int'sとして残すと、多くの"精度の損失 "警告が出ます。どんな勧告? –

関連する問題