Objective c 归档对象,然后取消归档
在上面的代码段中,指针变量cachedChannel的返回值为Objective c 归档对象,然后取消归档,objective-c,cocoa,cocoa-touch,Objective C,Cocoa,Cocoa Touch,在上面的代码段中,指针变量cachedChannel的返回值为unarchiveObjectWithFile:message。现在很明显,在第一次运行中,这将返回nil,但指针将在稍后的“if语句”中初始化。假设cachedChannelvar类似于 NSString *cachePath= [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; cac
unarchiveObjectWithFile
:message。现在很明显,在第一次运行中,这将返回nil,但指针将在稍后的“if语句”中初始化。假设cachedChannel
var类似于
NSString *cachePath= [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
cachePath= [cachePath stringByAppendingPathComponent:@"nerd.archive"];
// Load the cached channel
RSSChannel *cachedChannel= [NSKeyedUnarchiver unarchiveObjectWithFile:cachePath];
NSLog(@"unarchived data- %@ %p, x value- %d",cachedChannel,cachedChannel,cachedChannel.x);
// if one hasn't already been cached, create a blank one to fill up
if (!cachedChannel) {
cachedChannel= [[RSSChannel alloc] init];
NSLog(@"cachedChannel initialised- %@ %p",cachedChannel,cachedChannel);
cachedChannel.x=5;
}
代码第一次运行后,分配给cachedChannel
的对象将被序列化。
当我第二次运行测试项目时,传递了unarchiveObjectWithFile
:消息,以便将序列化对象返回并分配给cachedChannel
指针变量,它显示为具有不同对象id的不同对象。
它不再是指向[RSSChannel:0X123ff]
对象的cachedChannel,而是保存一些其他对象,如[RSSChannel:0X445ee]
这怎么可能呢??以前序列化的对象不应该是以后未归档的对象,并且具有相同的对象id驻留在相同的堆内存位置吗
这怎么可能呢??以前序列化的对象不应该是以后未归档的对象,并且具有相同的对象id驻留在相同的堆内存位置吗
一点也不。正如你所说,这是以后发生的事情。在后来的这个时候,记忆的情况完全不同了。这样想:如果你有从头开始创建对象的代码,例如[[MyObject alloc]init]
,你今天运行应用程序,然后退出,明天再次运行应用程序,那么MyObject的这两个实例,即使它们在应用程序的生命周期中扮演着非常相同的角色,也会有两个不同的内存地址
此外,我们在取消归档对象时创建的是一个不同于归档对象的实例-无论您在归档/取消归档时以何种方式指定,都与原始实例相同,但是一个不同的实例。可以这样想:archive unarchive是制作对象副本的一种精心制作的方法,一个实例的两个副本显然是两个不同的对象
毕竟,您可以归档对象,保留原始对象,并立即取消归档对象。那将是两个不同的对象。但他们不可能生活在同一个内存地址
听起来您可能试图使用内存地址作为某种唯一标识符。当心那件事。如果一个东西需要一个唯一的标识符,给它一个唯一的标识符作为属性。运行时不要依赖内存地址,除非在调试期间确认两个实例是同一个实例。是的,根据地址识别两个不同的对象是错误的。。我认为它们必须有相同的对象ID。但是如果归档对象和未归档对象完全不同,那么它们的状态也会不同吗?e、 g.:项(作为已初始化的数组对象)应该包含与项相同的对象(数组对象未归档)。取消归档obj的整个想法不是要从文件系统恢复以前的状态吗?当然,但它在内存中的地址不是其“以前状态”的一部分。这完全无关。不,它们的状态不会有什么不同,因为你已经仔细地安排了事情,使它们具有相同的状态。正如我在回答中所说,这就像
copy
的工作原理一样。“保存存档对象的状态并将其恢复为新对象的状态分别是encodeWithCoder:和decodeWithCoder:消息的工作”100%正确!这就是我在回答中所说的,当时我写道:“归档未归档是制作对象副本的一种精心制作的方式”。您就堆栈溢出提出了29个问题,其中21个得到了回答。但是你从来没有,一次也没有接受过任何答案。这完全违背了堆栈溢出的精神。您需要考虑堆栈溢出公民身份是如何工作的。问而不接受只是在偷懒。如果你那样做,为什么有人要帮助你?请回顾您以前的问题,查看答案,如果您对某个问题的其中一个答案感到帮助/满意,请接受它(单击复选标记)。-包括我的,如果我帮过你的话。@rahulbsb任何人给过你的答案左上角都有一个大的空复选标记(在带箭头的数字下面)。单击它以接受该答案作为帮助您的答案。请同时阅读帮助:
cachedChannel= [RSSChannel:0X123ff]