NSData大小和NSUserDefaults

时间:2012-04-05 19:51:52

标签: macos cocoa nsuserdefaults

有没有理由为NSUserDefaults存储一个大约50MB的NSData对象可能是个坏主意?

documentation中没有关于它的内容,但每当我看到使用NSUserDefaults时,它通常用于相当少量的数据。我想在NSUserDefaults中存储比在文件中存储更简单,所以我想尽可能使用它。

4 个答案:

答案 0 :(得分:1)

  1. 由于NSUserDefaults将对象存储为属性列表,因此它可能会使用文本(XML)格式的plist而不是二进制的plist。在这种情况下,NSData会将ints描述发送到文件中,该文件比实际大小大2倍,因为它实际上是数据的十六进制表示(加上空格填充等等)

  2. 然而,它在概念上被误用/滥用了。用户默认值是用户的默认值。也就是说,它们应该用于存储首选项/设置,而不是整个文件。这是文件处理API的任务(C stdio函数,NSFileHandle等......)

  3. 希望这有帮助。

答案 1 :(得分:1)

因为将50 MB的二进制数据转换为属性列表或从属性列表转换是非常低效的。在这种情况下,直接文件IO是唯一合理的选择。

答案 2 :(得分:1)

您的应用的NSUserDefaults域作为XML属性列表写入磁盘。当XML plist包含NSData时,数据以十六进制表示(加上一些空白以便于阅读) - 数据中的每个字节都变成文本的两个字符,因此50 MB数据变为100 MB。

更重要的是,属性列表不是随机访问文件:如果您(或者在这种情况下,Apple的NSUserDefaults实现)想要读取磁盘上属性列表中的值,则会读取整个文件并且解析为创建NSDictionary。如果进行更改并希望将其保留到磁盘,则整个字典将被序列化并写入文件。因此,对于100 MB文件而言,读取和解析或序列化和写入比1 kB文件花费更长的时间。这会发生在您(或Apple的框架中的某些代码,因为他们有时在内部使用NSUserDefaults)调用-[NSUserDefaults synchronize],这可能会在您的应用程序的生命周期中多次发生。

如果您已经拥有NSData,那么将其自己放入文件并不困难 - 这就是-[NSData initWithContentsOfFile:]-[NSData writeToFile:atomically:]的用途。 (在应用程序的docs目录中获取读/写路径只需要一两行;有关几个示例,请参阅Xcode项目模板。)

答案 3 :(得分:0)

访问用户默认值的任何其他应用程序都必须花时间阅读和解析您的100 MB。