【发布时间】:2010-04-24 15:48:02
【问题描述】:
objective-c 在 iPhone 上以原子方式写入文件有什么区别,两者之间有什么性能差异吗?
【问题讨论】:
标签: iphone objective-c file-io
objective-c 在 iPhone 上以原子方式写入文件有什么区别,两者之间有什么性能差异吗?
【问题讨论】:
标签: iphone objective-c file-io
原子一般意味着操作不能被中断将完成或没有效果。写入文件时,通过写入临时文件,然后在写入完成时将原始文件替换为临时文件来完成。
写入原子文件时发生崩溃意味着原始文件未被修改,并且存在可以删除的垃圾文件。正常写入时崩溃意味着预期的好文件已损坏。
在性能方面,成本是最低的。在写入期间,您将拥有一个文件的两个副本。文件替换是文件系统级别的一个非常简单的操作。
编辑:谢谢zneak
【讨论】:
以原子方式编写需要更多步骤 - 额外创建辅助文件。 NSString 类Reference 解释:
如果是,接收器被写入一个辅助文件,然后 辅助文件重命名为路径。如果否,接收者被写入 直接进入路径。 YES 选项保证该路径,如果它存在于 全部,即使系统在运行期间崩溃也不会损坏 写作。
下面是 pLists 的例子:
[array writeToFile:path atomically:YES];
当“YES”时,即使你在 XCode 中多次运行代码,pList 也只会更新一次,
[array writeToFile:path atomically:NO];
当“否”时,它会根据您运行相同的代码(重复更新)进行更新。
【讨论】:
文件系统不必为原子写入而求助于写入/重命名周期。具有锁定语义的文件系统允许您“锁定”文件的部分或全部,或者在某些情况下甚至可以执行附加到文件之类的操作,以帮助实现原子性。
@Randy,您对碎片的假设都可能是错误的。在大多数文件系统上,写入整个文件并关闭它会导致文件碎片更少,而在一次写入中写入大文件肯定会更好地使用大块。如果您的意思是文件块更有可能在磁盘上“爬行”,那取决于文件系统中的布局首选项。如果您正在写入闪存,您可能希望文件系统在可用存储空间中爬行,作为写入的一种自我平衡。
【讨论】: