首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileHandle不释放iOS中的内存

FileHandle不释放iOS中的内存
EN

Stack Overflow用户
提问于 2022-08-11 17:35:23
回答 1查看 49关注 0票数 2

我会把大文件发送到服务器。文件将被分割成块。当我调用FileHandle.readData(ofLength:)时,会收到很高的内存消耗。内存块不释放,过了一段时间,我收到了EOM异常和崩溃。分析器显示FileHandle.readData中的问题(ofLength:)(见屏幕截图)

代码语言:javascript
复制
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
            }
        }
    }

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-11 18:40:10

分配工具只是简单地显示初始分配未释放内存的位置。这取决于您如何确定您随后对该对象做了什么,以及为什么它没有及时发布。任何分析工具都不能帮助您实现这一点。它们只能指向最初分配对象的位置,这只是您研究的起点。

一个可能的问题可能是如果要创建Data-based URLRequest对象。这意味着,当相关的URLSessionTask请求正在进行时,Data被保存在内存中。如果是这样,您可能会考虑使用基于文件的uploadTask代替。这将防止在内存中保存与请求主体关联的Data

一旦你开始使用基于文件的uploadTask,这就引出了一个问题,那就是你是否需要/想把它分割成块。基于文件的uploadTask,即使在发送非常大的资产时,在运行时也只需要很少的内存.而且,在将来的某个时候,你甚至可以考虑使用背景会话,所以即使用户离开应用程序,上传也会继续。这些特征的结合可以完全消除块状现象。

您可能已经猜到,autoreleasepool可能是不必要的。这是为了解决一个非常具体的问题(在这个问题中,一个人在一个紧密的循环中创建和释放自动释放对象)。我怀疑你的问题在别的地方。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73324797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档