读取本地文件时应该使用哪个 NSDataReadingOptions?

Which NSDataReadingOptions should be used when reading a local file?

使用NSData(contentsOfURL:options:)读取本地文件时,哪个是合适的读取选项?

还有一个NSData(contentsOfURL:)没有NSDataReadingOptions。它默认使用哪个阅读选项?

参考Apple docs.

如果你使用方法:

NSData dataWithContentsOfFile:(NSString *)path 
                      options:(NSDataReadingOptions)readOptionsMask 
                        error:(NSError * _Nullable *)errorPtr;

适当的选项取决于您打算如何处理数据;如 Apple 文档中所述:

  • NSDataReadingUncached :指示文件不应存储在文件系统缓存中的提示。 (对于只读一次就丢弃的数据,这个选项可以提高性能。)
  • NSDataReadingMappedIfSafe : 如果可能且安全,提示文件应该被映射到虚拟内存。
  • NSDataReadingMappedAlways : 提示尽可能映射文件。 (如果两者都给出,这优先于 NSDataReadingMappedIfSafe。)

关于 mappedFiles 的一些解释:只有在保证文件在数据对象存在期间存在的情况下才应使用。通常使用 dataWithContentsOfFile: 方法更安全。

使用 mappedFiles 选项时,该方法假定映射文件可从底层操作系统获得。映射文件使用虚拟内存技术来避免在实际需要之前将文件页面复制到内存中。

另一种方法:

NSData dataWithContentsOfFile:(NSString *)path;

相当于 dataWithContentsOfFile:options:error,没有给出任何选项。

结论

如果我们把它们放在一起,你应该使用:

  • dataWithContentsOfFile: 如果您对数据或内存使用问题没有特殊需求。是比较安全的选择。
  • dataWithContentsOfFile:options:error 带有 NSDataReadingUncached 选项,如果您只使用数据一次
  • dataWithContentsOfFile:options:errorNSDataReadingMappedIfSafe 选项,如果您不想立即加载整个文件,并且您确定该文件将在 NSData 对象的整个生命周期内存在。
  • dataWithContentsOfFile:options:errorNSDataReadingMappedAlways 选项 - 与上述相同,但保护措施较少。

来源:

Apple Documentation : NSReadingOptions

Apple Documentation : dataWithContentsOfFile

Apple Documentation : dataWithContentsOfFile:options:error