8

正如我在上述主题中的问题所述,您通常必须满足哪些要求才能说“好的,我需要encodeWithCoder:为此initWithCoder:实例化”?通常您可以将对象状态写入NSUserDefaults,所以我很好奇您的专家何时决定使用一个与另一个?

4

4 回答 4

10

initWithCoder:解压缩 XIB 文件时由操作系统使用;如果您仔细观察,您会发现initWithFrame:您在 XIB 中创建的视图不需要这样做;他们会initWithCoder:打电话来的。

于 2009-05-01T00:51:09.507 回答
9

用户默认值基本上是一个属性列表。属性列表类似于 JSON,只能存储特定类型的数据——NSString、NSNumber、NSData、NSDate、NSArray、NSDictionary。如果您尝试在用户默认值中存储任何其他内容,您将收到异常。属性列表也不能处理任意对象图,只能处理树。

您可以随时获取自定义状态并将其转换为与属性列表兼容的数据结构,然后将其存储在用户默认值中;但是你基本上是在实现一种对象序列化机制,你不妨使用 NSArchiver 已经提供的更强大的机制。

于 2009-05-01T00:19:33.780 回答
6

NSCoder是实现序列化的标准 Cocoa 方法。有关详细信息,请参阅 Apple 的Cocoa 存档和序列化编程指南

于 2009-04-30T23:53:43.950 回答
1

每当我有某种复杂的数据要存储而我不必手动编辑时,我都会使用 NSCoder。例如,我的应用Converter将从 Internet 下载的货币汇率存储在 NSCoder 存档中。但是,这是它保存在此类存档中的唯一内容:只能手动更改的单位定义保存在应用程序包中的一系列 plist 文件中,最近选择的单位和值等内容保存在NSUserDefaults。

于 2009-05-01T00:58:45.727 回答