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
Cocoa NSCoder vs NSDictionary,你什么时候用什么?_Cocoa - Fatal编程技术网

Cocoa NSCoder vs NSDictionary,你什么时候用什么?

Cocoa NSCoder vs NSDictionary,你什么时候用什么?,cocoa,Cocoa,我想知道如何决定何时使用NSDictionary或NSCoder/NSCoding 对于一般的属性列表和NSDictionary,似乎是生成XML文件的简单方法,这些XML文件在应用程序之外很容易编辑 在处理包含数据的自定义类或可能嵌套在其中的其他自定义类时,NSCoder/NSCoding似乎是更好的方法,因为它将逐步遍历所有包含的对象类,并在使用存档命令时对它们进行编码 NSDictionary似乎需要更多的工作才能将所有属性或数据特征保存到单个级别,其中as NSCoder/NSCodin

我想知道如何决定何时使用NSDictionary或NSCoder/NSCoding

对于一般的属性列表和NSDictionary,似乎是生成XML文件的简单方法,这些XML文件在应用程序之外很容易编辑

在处理包含数据的自定义类或可能嵌套在其中的其他自定义类时,NSCoder/NSCoding似乎是更好的方法,因为它将逐步遍历所有包含的对象类,并在使用存档命令时对它们进行编码

NSDictionary似乎需要更多的工作才能将所有属性或数据特征保存到单个级别,其中as NSCoder/NSCoding将自动编码实现NSCoding接口的嵌套自定义类


除此之外,它是二进制数据,在应用程序之外是不可编辑的。是否有真正的理由使用一个而不是另一个?沿着这些路线,是否有一个指标,表明你应该在两者之间倾斜?我遗漏了一些明显的东西吗?

我想你有点困惑,NSDictionary是一种数据结构,它也碰巧实现了NSCoding协议。因此,本质上,您可以将所有数据放入NSDictionary并在以后对其进行编码,也可以实现NSCoding协议并使用NSCoder API对对象树进行编码。根据传入EncoderWithCoder:方法的NSCoder对象的类型,是编码的输出

苹果的文档中有这样一句话:

MacOSX序列化存储值对象的简单层次结构,如字典、数组、字符串和二进制数据。序列化仅保留对象的值及其在层次结构中的位置。反序列化时,对同一值对象的多个引用可能会导致多个对象。对象的易变性不会得到维护

MacOSX归档文件存储任意复杂的对象图。存档保留图形中每个对象的标识以及它与图形中所有其他对象的所有关系。未归档时,重建的对象图应该是原始对象图的精确副本,很少有例外

我的解释是,如果您想存储简单的值,序列化(例如使用NSDictionary)是一种很好的方法。如果您希望存储任意类型的对象图,并保留唯一性和易变性,那么最好使用归档(例如,与NSCoder一起使用)

您可能还想阅读Apple的,其中关于对象图的重新链接页面是其中的一部分,因为它很好地涵盖了这个主题。

我不太喜欢使用NSCoding/NSCoder/NSArchiver(我们需要选择一个名称!)将对象图序列化到文件中

以这种方式创建的档案极其脆弱。如果您保存一个Foo类的对象,那么您需要确保当您将数据加载回应用程序时,您的应用程序中有一个Foo类


从与其他应用程序共享文件甚至转发与未来应用程序的兼容性的角度来看,这使得基于NSCoder的序列化变得困难。

我忘了列出我的建议

NSCoding在某些情况下是可以的:如果你只是在做一些快速简单的事情(尽管你确实需要编写很多代码——每个类有两个方法可以序列化)。如果您不担心与其他应用程序的兼容性,也可以这样做

通过属性列表导出/导入(可能使用NSPropertyListSerialization类)是一个很好的解决方案。基于XML的plist易于创建和编辑。plists的主要优点是,您不会将文件格式仅绑定到应用程序


您还可以创建自己的基于XML的文件格式,并使用NSXMLDocument API和friends对其进行读/写。这实际上并不比使用属性列表多做多少工作。

我认为很明显,他/她指的是属性列表序列化与NSCoder序列化。同意。我走了这条路,后来后悔了。我只是在学习这些东西,但似乎
NSKeyedArchiver
NSKeyedArchiver
提供了一种。。。顺便说一句,您可以在加载数据时使用更改类。