2017-06-13 112 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位創建的文件。我只是將64位文件擴展名更改爲「myExt2」,因此程序知道在哪個「版本」中創建了該文件,並防止舊版本的應用程序甚至看到新的64位文件。

恐怕我在聯盟中脫離了領域。

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

+0

當使用舊的對象代碼(使用int和float)時,64位應用程序可以加載舊文件嗎? – Losiowaty

+0

是的,它可以。如果我使用int/float,那麼64位應用程序將打開它們。 @losiowaty –

回答

0

當我們從評論知道,64位應用程序打開舊文件精細,使用32位來自應用程序的版本代碼時。我建議你保留舊的代碼,將其重命名爲mySquareOld。然後,每當用戶嘗試打開舊的文件執行以下操作:

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

第二步應易於一旦對象被反序列化,因爲intfloatlongCGFloat很好地適應分別。

+0

如果我打算使用舊的32位代碼打開文件,爲什麼要開發64個類?不要試圖變得困難。我只是不明白 –

+0

那麼,如果應用程序編譯爲64位體系結構罰款,並且你徹底地測試它,並確信一切工作正常,那麼你似乎不需要做代碼更改(至少在這一部分的應用程序)。我強烈建議你在'CGPoint'屬性中謹慎地測試這些值,因爲它們在'x'和'y'內部使用'CGFloat',如果我沒有弄錯,'CGFloat'是'typedef'對於32位的'float',對於64位的'double'是'typedef'。 – Losiowaty

+0

謝謝。如果我將類對象作爲「int」,我會得到很多「精度丟失」警告。任何建議? –