我正在使用NSData保护iOS 4.2上的文件。 该文件刚刚使用webservice下载到临时文件夹中,现在我想使用NSData和以下代码将其复制并保护到其最终目的地:
NSData oData = NSData.FromFile ( sSourcePathAndFile );
NSError oError = null;
oData.Save ( sDestPathAndFile, NSDataWritingOptions.FileProtectionComplete, out oError );
我想知道:如果文件现在真的很大,NSData会将它保存在块中,还是会将整个文件加载到内存中,最终运行内存不足,然后失败?
旁注:如果我备份我的iOS设备并恢复到另一台设备,受保护的文件是否可以在那里读取?如果是的话,整个保护对我来说没有多大意义。
答案 0 :(得分:1)
从检查monotouch文档(虽然我不是专家),NSData.FromFile
似乎完全映射到Objective-C:
NSData +dataWithContentsOfFile:
导致整个文件立即加载到内存中。这是this page - “通过读取路径指定的文件中的每个字节的数据对象”,这与Apple的NSData引用的the relevant bit一字不差。
似乎没有单调的等效物,但在Objective-C中,正确的做法是使用:
NSData +dataWithContentsOfMappedFile:
记录在案here。
iOS拥有完全虚拟化的内存子系统,就像其他所有操作系统一样,它只缺少页面文件。当您使用dataWithContentsOfMappedFile:时,您将文件映射到主内存,导致正常的分页机制在物理RAM中保留尽可能多的内容,因为有空间允许,就像任何其他虚拟内存池一样。
虽然dataWithContentsOfMappedFile:可能会回退到dataWithContentsOfFile:在某些环境中(虽然它不应该在iOS上),系统不能替换dataWithContentsOfMappedFile:for dataWithContentsOfFile:在所有情况下都要求因为前者要求文件在磁盘上保持不变对于NSData对象的生命周期,后者保证立即读取它,然后允许您根据需要删除或修改原始文件。
希望更像是一个monotouch专家的人可以建议你如何添加NSData.FromMappedFile
或者如何通过其他方式公开这个功能。
答案 1 :(得分:0)
如果要控制缓冲多少以使设备不会耗尽内存,可以打开FileStream(System.IO)并手动写入字节。这是关于MonoTouch的好消息。您可以使用.NET框架。