簡體   English   中英

將32位對象轉換為64位對象

[英]Converting 32 bit objects to 64 bit objects

我正在將我的應用程序更新為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位創建的文件。 我只是將64位文件擴展名更改為“ myExt2 ”,因此程序知道文件是在哪個“版本”中創建的,並阻止了應用的舊版本甚至看不到新的64位文件。

恐怕我不在領域之列。

如何將32位文件(或在應用程序中將其轉換)以在64位程序中打開? 沒有舊文件支持,我無法發送我的應用程序更新。

從評論中我們知道,當使用32位應用程序版本中的代碼時,64位應用程序可以很好地打開舊文件。 我建議您保留舊代碼,將類重命名為mySquareOld 然后,只要您的用戶嘗試打開舊文件,請執行以下操作:

  1. 使用舊代碼讀取數據
  2. mySquareOld轉換為mySquare
  3. 刪除舊文件
  4. mySquare保存在相同的文件名下,但具有新的結構。

對象反序列化后,第二步應該很容易,因為intfloat應該分別適合longCGFloat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM