我正在将我的应用更新为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位程序中打开?我无法在没有旧版文件支持的情况下发送我的应用更新。
答案 0 :(得分:0)
正如我们从评论中所知,当使用32位应用程序版本的代码时,64位应用程序会打开旧文件。我建议您保留旧代码,将类重命名为mySquareOld
。然后,只要您的用户尝试打开旧文件,请执行以下操作:
mySquareOld
转换为mySquare
mySquare
保存在相同的文件名下但具有新结构。对象反序列化后,第二步应该很容易,因为int
和float
应该分别适合long
和CGFloat
。