Swift懒惰var不一致的行为

时间:2017-03-08 15:30:54

标签: swift xcode8 macos-sierra lazy-initialization

我在延迟初始化时遇到了一个非常不寻常的问题。

我的应用程序从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

这实际上是正确的数据。随后运行的应用程序始终显示正确的数据。

我已经在可以写入文件的所有点放置了断点,以验证没有数据写入文件。

补充意见:

  1. 只有少数选定的文件才会出现此错误。绝大多数 文件读取正确。
  2. 只有发布版本配置才会出现此错误。它在Debug配置中不会发生。这就是为什么 我不得不使用print语句来观察发生的事情。
  3. 如果我不懒惰地初始化数据,则不会发生此错误, 即如果我在对象出现时立即从文件中读取数据 初始化。
  4. 我很难理解可能导致这种奇怪行为的原因。

0 个答案:

没有答案