你什么时候在iPhone上使用encodeWithCoder:和initWithCoder:?

时间:2009-04-30 23:33:00

标签: iphone objective-c cocoa-touch initwithcoder

正如我在上述主题中提出的问题所述,为了说“好的,我需要encodeWithCoder:initWithCoder:实例化”,您通常需要满足哪些要求?通常你可以将对象状态写入NSUserDefaults,所以我很好奇你们什么时候专家决定使用哪一个?

4 个答案:

答案 0 :(得分:10)

在取消存档XIB文件时,操作系统使用

initWithCoder:;如果你仔细观察,你会发现你没有为你在XIB中创建的视图调用initWithFrame:;他们会initWithCoder:致电。

答案 1 :(得分:9)

用户默认值基本上是属性列表。属性列表类似于JSON,只能存储特定类型的数据 - NSString,NSNumber,NSData,NSDate,NSArray,NSDictionary。如果您尝试在用户默认值中存储任何其他内容,则会出现异常。属性列表也无法处理任意对象图,只能处理树。

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

答案 2 :(得分:6)

NSCoder是实现序列化的标准Cocoa方法。有关详细信息,请参阅Apple的Archives and Serializations Programming Guide for Cocoa

答案 3 :(得分:1)

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