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
:message。现在显然在第一次运行时,这将返回nil,但指针将在稍后的“if-statement”中初始化。让我们说cachedChannel
var类似于
cachedChannel= [RSSChannel:0X123ff]
代码完成首次运行后,分配给cachedChannel
的对象将被序列化。
当我第二次运行测试项目并传递unarchiveObjectWithFile
:消息以便返回序列化对象并将其分配给cachedChannel
指针var时,它显示为具有不同对象的不同对象-ID。
而不是cachedChannel指向[RSSChannel:0X123ff]
对象,它现在持有一些其他对象,如[RSSChannel:0X445ee]
怎么可能这样?以前序列化的对象不应该是以后使用驻留在同一堆内存位置的相同object-id取消归档的对象吗?
答案 0 :(得分:0)
这怎么可能?以前序列化的对象不应该是稍后将使用驻留在同一堆内存位置的相同object-id取消归档的对象吗?
完全没有。正如你所说,这是后来发生的。而在此之后,内存情况则完全不同。可以这样想:如果你有从头开始创建对象的代码,例如[[MyObject alloc] init]
,你今天运行应用程序,然后退出它并明天再次运行应用程序,这两个MyObject实例,即使它们在应用程序的生命周期中扮演相同的角色,也会有两个不同的内存地址
此外,我们在取消归档对象时创建的是与归档的不同实例 - 与归档/取消归档时指定的任何方式完全相同,但是一个不同的实例。可以这样想:archive-unarchive是一种精心制作对象的副本的方法 - 而且一个实例的两个副本显然是两个不同的对象。
毕竟,您可以归档对象,挂起到原始对象,然后立即取消归档已归档的对象。那将是两个不同的对象。但他们不可能住在同一个记忆地址!
听起来您可能正在尝试将内存地址用作某种唯一标识符。要小心。如果某个东西需要唯一标识符,将作为属性添加。不要在运行时依赖任何的内存地址,除非在调试期间确认两个实例是同一个实例。