我在延迟初始化时遇到了一个非常不寻常的问题。
我的应用程序从mp4文件中读取元数据,编辑一些数据,然后将其写回文件。在以前的版本中,我在打开文件时读取所有数据。在当前版本中,我已经切换到延迟读取数据以提高性能并降低内存占用。但是,我遇到了一个非常零星但可重现的错误,其中在延迟初始化期间似乎从文件中错误地读取了几个字节。
这是初始化代码:
lazy var data: Data = { [unowned self] in self.readDataFromFile() }()
func readDataFromFile() -> Data {
guard let file = fileHandle else { return Data() }
file.seek(toFileOffset: dataFilePointer)
let data = file.readData(ofLength: dataCountInFile)
print(Pointer: \(dataFilePointer)" + " Data: " + data.hexBytes(length: 32))
return data
}
添加了print语句以调试此问题。 fileHandle是我在选择文件时创建的FileHandle对象。通过解析文件以获取指向数据的指针,在打开文件时设置dataFilePointer和dataCountInFile变量。
当我第一次从文件中读取时,这就是我在日志中看到的内容:
指针:6808113917数据:14600000 1EA70000 12FB0000 19260000 12E20000
如果我在不向文件写入任何数据的情况下停止应用程序,然后重新启动,而不执行任何其他操作,这就是我在日志中看到的内容:
指针:6808113917数据:CFCB378C CFCBCDDB 00015F90 4B4231AA 55C40000
这实际上是正确的数据。随后运行的应用程序始终显示正确的数据。
我已经在可以写入文件的所有点放置了断点,以验证没有数据写入文件。
补充意见:
我很难理解可能导致这种奇怪行为的原因。