我会把大文件发送到服务器。文件将被分割成块。当我调用FileHandle.readData(ofLength:)时,会收到很高的内存消耗。内存块不释放,过了一段时间,我收到了EOM异常和崩溃。分析器显示FileHandle.readData中的问题(ofLength:)(见屏幕截图)
func nextChunk(then: @escaping (Data?) -> Void) {
self.previousOffset = self.fileHandle.offsetInFile
autoreleasepool {
let data = self.fileHandle.readData(ofLength: Constants.chunkLength)
if data == Constants.endOfFile {
then(nil)
} else {
then(data)
self.currentChunk += 1
}
}
}


发布于 2022-08-11 18:40:10
分配工具只是简单地显示初始分配未释放内存的位置。这取决于您如何确定您随后对该对象做了什么,以及为什么它没有及时发布。任何分析工具都不能帮助您实现这一点。它们只能指向最初分配对象的位置,这只是您研究的起点。
一个可能的问题可能是如果要创建Data-based URLRequest对象。这意味着,当相关的URLSessionTask请求正在进行时,Data被保存在内存中。如果是这样,您可能会考虑使用基于文件的uploadTask代替。这将防止在内存中保存与请求主体关联的Data。
一旦你开始使用基于文件的uploadTask,这就引出了一个问题,那就是你是否需要/想把它分割成块。基于文件的uploadTask,即使在发送非常大的资产时,在运行时也只需要很少的内存.而且,在将来的某个时候,你甚至可以考虑使用背景会话,所以即使用户离开应用程序,上传也会继续。这些特征的结合可以完全消除块状现象。
您可能已经猜到,autoreleasepool可能是不必要的。这是为了解决一个非常具体的问题(在这个问题中,一个人在一个紧密的循环中创建和释放自动释放对象)。我怀疑你的问题在别的地方。
https://stackoverflow.com/questions/73324797
复制相似问题