gpt4 book ai didi

iphone - NSUserDefaults 和 NSArray 中自定义对象的条件编码

转载 作者:行者123 更新时间:2023-12-03 21:19:41 25 4
gpt4 key购买 nike

我知道有很多帖子涉及如何将自定义对象存档在 NSArray 或 NSMutableArray 中并将它们保存在 NSUserDefaults 中。符合 NSCoding 协议(protocol)并保存到 NSUserDefaults 不是问题,我经常使用 NSUserDefaults 来存储用户提交的数据在我的应用程序中 - 它主要包含代表 Person 的对象(让我们将 NSObject 子类称为“Person”),它可以将 NSObject 子类“Property”的多个对象存储在 NSMutableArray 中。因此,数据结构如下所示:

NSMutableArray "persons":
Person "aPerson":
NSMutableArray "properties":
Property "aProperty"
Property "anotherProperty"
Person "anotherPerson:
...

归档和恢复信息一开始没有问题,因为 Person 和 Property 都符合 NSCoding Protocol - 但现在出现了一个问题,尽管过去几天有数千个 google 请求,但我仍无法解决; )

一些 Property 对象包含对其他 Person 的引用(“参与者”,链接到同一属性并包含在 NSMutableArray 中)。当我使用 NSKeyedArchiver 将整个数据存储到 NSUserDefaults 时,我使用

[aCoder encodeObject:participants forKey:@"participants"];

在Property的“encodeWithCoder”方法中归档NSMutableArray“参与者”,它存储对其他Person对象的引用。但是当我解码这些 Person 对象时,它们是新创建的,并与其他地方已经存在的 Person 对象分开。 NSMutableArray“参与者”仅包含引用,即指向 Person 对象的弱链接,因此应该对其内容进行条件编码,就像可以在“encodeWithCoder”中手动处理其他对象一样:

[aCoder encodeConditionalObject:anObject forKey:aKey];

当 NSMutableArray 被解码时,它应该表示对已经存在的 Person 对象的引用列表 - 而不是全新的对象!测试“aPerson==[[aDecoder DecodeObjectForKey:@"participants"] objectAtIndex:0]”当前返回 NO,尽管它在编码/解码过程发生之前已返回 YES。

我希望我的解释在某种程度上可以理解,并且您可以帮助我解决我的问题:) 简而言之:如何对 NSMutableArray 中包含的自定义对象进行条件编码?

谢谢!

最佳答案

如果NSMutableArray对其包含的对象使用encodeConditionalObject:forKey:,则意味着这些对象根本没有被编码,如果它们没有被编码的​​话无条件编码在对象图中的其他地方。在这种情况下这对您没有帮助(数组只是空的)。

问题在于您无法真正对内存中对象的引用进行编码。对象引用基本上只是指向内存中地址的指针。当您下次启动应用程序并创建完全相同的对象(无论是通过取消存档还是以其他方式)时,它几乎肯定会在内存中具有不同的地址。解归档程序无法“神奇地”知道哪个现有对象对应于它已归档的引用,因为当您退出应用程序时,内存地址(对象的“身份”)将失去其所有含义。

您必须使用其他方式来标识您的对象,例如数据库行 ID、字典键等,并手动建立存档键和与该键对应的现有对象的连接。

关于iphone - NSUserDefaults 和 NSArray 中自定义对象的条件编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6008818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com