为什么属性列表只存储少量数据?

时间:2015-02-10 16:53:54

标签: ios objective-c property-list

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

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

2 个答案:

答案 0 :(得分:0)

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

如果plist中有太多数据,则内存不足,读写效率低下。

当你有大量数据时,你很少需要在内存中同时使用它。对于大量数据,您通常只需要一次更新少量数据或添加新数据。此时有更好的选项,如数据库(SQLite或Core Data)。

答案 1 :(得分:0)

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

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

例如:您有一个属性列表,该列表是10000个字典的数组,您可以在单个字典中更改值。如果你想保存这个,所有10000个词典都必须写到磁盘上,即使它们中有9999个没有改变。这可能需要花费很多时间,这与项目数量或O(n)大致成线性关系。如果项目数量增加一倍,则需要两倍的时间。

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

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

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

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