我会把大文件发送到服务器.该文件将被分成块.当我调用FileHandle.readData(ofLength:)时,我收到很高的内存消耗.块的内存没有解除分配,一段时间后,我收到EOM异常和崩溃. Profiler在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
            }
        }
    }

enter image description here enter image description here

推荐答案

分配工具只是向您显示未释放的内存最初是在哪里分配的.这是由你来弄清楚你后来对那个物体做了什么,为什么它没有及时释放.没有一种分析工具可以帮助您做到这一点.它们只能指向对象最初分配的位置,这只是您研究的起点.

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

一旦你开始使用基于文件的uploadTask,这就回避了一个问题,那就是你是否需要/想要把它分成块.即使在发送非常大的资源时,基于文件的uploadTask在运行时也只需要很少的RAM.而且,在future 的某个时间点,你甚至可以考虑使用后台会话,这样即使用户离开应用程序,上传也会继续.这些功能的组合可能会完全避免组块.

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

Ios相关问答推荐

如何调整包含extView的UICollectionViewListCell的大小?

PieChartView未以编程方式显示在屏幕上

SwiftUI.从自定义视图修改器访问自定义视图子视图

在iOS 17脉冲符号效果不起作用的情况下制作UIBarButtonItem动画(没有UIImageView)

无法在所有窗口上方显示图像

在SwiftUI中动态隐藏列表的空部分

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

如何在后台显示 Swift UI 中的通讯通知?

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

UIViewRepresentable - MKMapView 没有得到更新

使用swift将图像转换为A4大小的pdf

在 UICollectionView 上动态设置布局导致莫名其妙的 contentOffset 变化

使用 Vim 代替(或与)Xcode 进行 iOS 开发

Xcode 故事板:内部错误.请提交错误

没有 Mac 的 Xamarin Visual Studio IOS 开发?

判断密钥是否存在于 NSDictionary 中

无法加载从带有标识符的包中的笔尖引用的图像

文本未包含在 swift UI 中

UINavigationBar - 以编程方式设置标题?

在 NSUserDefaults 中保存图像?