将32位对象转换为64位对象

时间:2017-06-13 13:18:18

标签: ios objective-c macos cocoa 64-bit

我正在将我的应用更新为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位应用程序上创建的,则会打开&#34; 32位&#34;版本,他们打开罚款。

更新为64位后,在&#34; 64位&#34;中创建的文件打开很好,但使用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位文件扩展名更改为&#34; myExt2 &#34;所以该程序知道哪个&#34;版本&#34;该文件是在该文件中创建的,并且防止旧版本的应用程序甚至看到新的64位文件。

我担心在这个领域我不在联盟之内。

如何将我的32位文件(或在应用程序中转换它们)转换为在我的64位程序中打开?我无法在没有旧版文件支持的情况下发送我的应用更新。

1 个答案:

答案 0 :(得分:0)

正如我们从评论中所知,当使用32位应用程序版本的代码时,64位应用程序会打开旧文件。我建议您保留旧代码,将类重命名为mySquareOld。然后,只要您的用户尝试打开旧文件,请执行以下操作:

  1. 使用旧代码
  2. 读取数据
  3. mySquareOld转换为mySquare
  4. 删除旧文件
  5. mySquare保存在相同的文件名下但具有新结构。
  6. 对象反序列化后,第二步应该很容易,因为intfloat应该分别适合longCGFloat