我有一个使用NSFileWrapper
创建用户数据备份的应用。此备份文件包含文本和媒体文件(压缩与此处无关)。有时这些备份文件会变得非常大,超过200 MB。当我调用NSFileWrapper -writeToURL...
时,它似乎将整个内容作为写入过程的一部分加载到内存中。在较旧的设备上,由于内存限制,这会导致我的应用程序被系统终止。
是否有一种简单的方法可以避免NSFileWrapper
将所有内容加载到内存中?我已经阅读了我能找到的每个NSFileWrapper
个问题。关于如何解决这个问题的任何建议?
以下是备份文件的当前文件结构:
BackupContents.backupxyz
user.txt
- folder1
- audio files
asdf.caf
asdf2.caf
- folder2
- audio files
asdf3.caf
同样,请不要告诉我压缩我的音频文件。这只是对有缺陷设计的创可贴。
似乎我可以使用NSFileManager
将所有文件移动/复制到目录中,然后将该目录作为包。我应该走那条路吗?
答案 0 :(得分:3)
当NSFileWrapper
树写入磁盘时,它会尝试将原始文件的硬链接执行到新位置,但前提是您为originalContentsURL
提供参数。
听起来您正在以编程方式构建文件包装器(对于备份方案),因此您的文件可能分散在整个文件系统中。这意味着,当您writeToURL
时,您 originalContentsURL
。这意味着硬链接逻辑将被跳过,文件将被加载,以便可以重写。
因此,如果您需要硬链接行为,则需要找到提供originalContentsURL
的方法。通过向初始writeToURL
电话提供适当的网址,可以轻松完成此操作。
或者,您可以尝试将NSFileWrapper
子类化为常规文件,并为它们提供内部挂起的NSURL
。您需要覆盖writeToURL
才能将此新网址传递至super
,但该网址应足以触发硬链接代码。然后,您希望将此NSFileWrapper
的子类用于您想要硬链接的大文件。