Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 归档对象,然后取消归档_Objective C_Cocoa_Cocoa Touch - Fatal编程技术网

Objective c 归档对象,然后取消归档

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

在上面的代码段中,指针变量cachedChannel的返回值为
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]