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 NSUserDefaults vs NSKeyedArchiver&;NSCoder&;系列化_Cocoa_Cocoa Touch_Persistence_Nskeyedarchiver_Nscoder - Fatal编程技术网

Cocoa NSUserDefaults vs NSKeyedArchiver&;NSCoder&;系列化

Cocoa NSUserDefaults vs NSKeyedArchiver&;NSCoder&;系列化,cocoa,cocoa-touch,persistence,nskeyedarchiver,nscoder,Cocoa,Cocoa Touch,Persistence,Nskeyedarchiver,Nscoder,根据苹果公司的文档,档案将数据转换成独立于体系结构的字节流。序列化数据(如将值保存到属性列表)和存档数据之间有什么区别 是否可以使用NSCoder创建存档?NSCoder协议是否仅用于存档自定义对象 我理解归档是保存对象图关系和维护对象可变性的一种方式——我是否正确地认为,为了保存具有自定义对象的对象图,我需要将这些对象编码为NSData,将它们归档到字节流以维护图关系,然后可以选择使用NSUserDefaults保存到默认数据库还是保存到磁盘 另外,默认数据库和保存到磁盘之间有什么区别 我只是

根据苹果公司的文档,档案将数据转换成独立于体系结构的字节流。序列化数据(如将值保存到属性列表)和存档数据之间有什么区别

是否可以使用NSCoder创建存档?NSCoder协议是否仅用于存档自定义对象

我理解归档是保存对象图关系和维护对象可变性的一种方式——我是否正确地认为,为了保存具有自定义对象的对象图,我需要将这些对象编码为NSData,将它们归档到字节流以维护图关系,然后可以选择使用NSUserDefaults保存到默认数据库还是保存到磁盘

另外,默认数据库和保存到磁盘之间有什么区别

我只是想更好地理解这些术语是如何相互关联的

我已经阐述了我对这些事物如何相互关联的一般想法:

我认为-

NSKeyedArchiver用于将对象图编码并存储为字节流。它遍历对象图,维护关系,并对每个对象调用编码协议方法。NSKeyedArchiver只是跟踪并保存对象图——我们可以将其保存到磁盘,也可以保存到NSUserDefaults(属性列表)。 *建议将数据归档到磁盘上的文件目录,而不是NSUSERDEFAULT

只要对象是数组、字符串、整数等,就可以将其序列化为属性列表(或NSUserDefaults),而无需对其进行编码

假设我们有一个数组(它自动与NSKeyedArchiver和PropertyListSerializer兼容),其中充满了自定义对象。这些自定义对象必须实现NSCoder协议方法。然后,在其他地方,我们可以使用该数组创建一个等于NSKeyedArchive的NSData实例,并将该NSData实例保存到所需位置

所发生的是,归档程序遍历该数组的内容,实现每个对象所遵循的NSCoder协议方法。它跟踪对象(数组)中的关系,持久化对象图

当我们想要返回数据时,我们可以进入保存到的文件,检查其内容,并创建NSData的实例。我们使该实例等于指定路径的dataWithContentsOfFile。然后,我们创建一个数组,并通过调用NSKeyedUnarchiver unarchiveObjectWithData方法将NSData解包到该数组中。archiver遍历NSData实例中的每个对象并调用initWithCoder,本质上是对字节流进行反序列化

我们可以存放物品的地方- NSUserDefaults 磁盘(文件路径)

存储自定义对象的方法- NSKeyedArchiver,它实现NSCoder协议方法,将自定义对象转换为表示对象图的字节流


我们必须使用什么来存储自定义对象?NSCoder协议方法。

所有这些都属于持久性的标签。根据您的需要,有很多方法可以做到这一点。归档是您提到的最普遍的方式,可以根据您的需要进行定制。用户默认值是建立在这之上的,它为存储用户配置数据提供了一个更简单的API。例如,不适合以用户默认值存储字处理器文档。另一个更简单的持久性API是CoreData。我认为用户默认值和coreData都是构建在归档API之上的。今天,如果你想创建用户可移动文件,我相信coreData在大多数情况下都是你的工具instances@pco494实际上,使用用户默认值不需要存档。您可以直接存储某些数据类型,而无需保留对象图(您可以只存储对象层次结构),无需对数据进行编码和解码。此外,您可以归档到数据对象(NSData),但如果您只是存储字符串、数组、int等,则不需要归档或编码任何内容。你可以只存储在NSUserDefaults中,绕过所有这些。很抱歉,我不清楚。这正是我的观点。NSUserDefaults隐藏了NSCoding东西,但我相信它仍然在NSUserDefaults内部使用,但我可能错了。