1

是否有任何理由将 NSData 对象说 ~50MB 存储到 NSUserDefaults 中可能是个坏主意?

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

4

4 回答 4

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

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

希望这可以帮助。

于 2012-04-05T19:57:54.640 回答
1

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

于 2012-04-05T19:58:03.117 回答
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 项目模板。)

于 2012-04-05T20:18:07.930 回答
0

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

于 2012-04-05T20:23:49.773 回答