0

我是 Objective-c 的新手,我正在尝试理解属性列表的概念。我正在阅读这篇文章https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html

我几乎很清楚这个概念,但这篇文章说“属性列表适合存储少量数据”。但为什么只适用于少量?如果我使用大量数据会发生什么?

4

2 回答 2

0

理论上,您可以在属性列表中存储大量数据,但在一定大小时它变得不切实际。您需要将整个属性列表读入内存才能使用它。你不可能只阅读你需要的部分。这限制了您拥有的内存量。

然后,如果您更改了庞大属性列表中的某些值,则必须将整个内容写入磁盘。不能只写更新的部分。

例如:您有一个包含 10000 个字典的数组的属性列表,并且您更改了单个字典中的值。如果你想保存它,所有 10000 个字典都必须写入磁盘,即使其中 9999 个没有改变。这可能需要很长时间,这与项目数或 O(n) 呈线性关系。也就是说,如果有两倍的项目,则需要双倍的时间。

如果将其与数据库(如 Core Data 可以使用的 sqlite)进行比较,您会发现数据库只需要写入单个更改的记录,无论有多少条记录。所以它总是花费相同的时间,与 O(1) 的项目数量无关。

与他们合作也变得相当困难。你只有字典、数组、字符串、数字等等。这可能是您需要存储的所有数据,但在内存中您通常希望使用自己的类。这是属性列表不能做的另一件事。在加载时,您必须遍历整个属性列表以创建模型对象,而在保存时,您必须反向执行该过程。这又很慢,而且这样的代码写起来也不是很有趣。

财产清单也几乎是“仅限苹果”。因此,如果您想与其他平台交换文件,您必须在那里做更多的工作来读取和写入该格式。理论上苹果甚至可以改变格式。

但是,如果您将整个文件加载到内存中并无论如何都将其完全写出,那么您最好使用大型属性列表文件,如果您可以忍受其他限制的话。

于 2015-02-10T17:13:48.283 回答
0

属性列表只是一个NSDictionaryor NSArray。该文件必须作为一个整体进行读取或写入。这意味着整个事情都在记忆中。如果您只更改一点点,则必须重写整个文件。

如果 plist 中的数据过多,可能会耗尽内存,导致读写效率低下。

当您有大量数据时,您很少需要一次将它们全部存储在内存中。对于大量数据,您通常只需要一次更新少量数据或添加新数据。此时有更好的选择,例如数据库(SQLite 或 Core Data)。

于 2015-02-10T17:06:53.787 回答