我正在用Swift开发一个iOS应用,它可以捕获旋转视图的视频,但我遇到了内存泄漏问题。在导出视频后,内存中仍然存储了2GB的多余内存,即使在函数完成后也没有释放。这个问题仍然存在,并且当尝试在生产环境中第二次运行该函数时,应用会崩溃。
这个问题似乎发生在创建图像缓冲区时。下面是相关的代码片段:
// ViewFrame struct and render method
struct ViewFrame {
private let image: UIImage?
private let snapshot: UIView?
// ... initializers omitted for brevity ...
func render() -> UIImage {
if let existingImage = image {
return existingImage
} else {
return snapshot!.asImage(afterScreenUpdates: true)
}
}
}
// RecordView function within ViewRecordingSession class
private func recordView() {
// ... other code omitted for brevity ...
Timer.scheduledTimer(withTimeInterval: 1 / framesPerSecond, repeats: true) { [weak self] timer in
guard let strongSelf = self else { return }
if !strongSelf.isRecording {
timer.invalidate()
uiView.removeFromSuperview()
} else {
if strongSelf.useSnapshots, let snapshotView = uiView.snapshotView(afterScreenUpdates: false) {
strongSelf.frames.append(ViewFrame(snapshot: snapshotView))
} else {
strongSelf.frames.append(ViewFrame(image: uiView.asImage(afterScreenUpdates: false)))
}
// ... other code omitted for brevity ...
}
}
}
// GenerateAsset function within ViewRecordingSession class
private func generateAsset() {
assetGenerationCancellable?.cancel()
let frameImages = frames.map { $0.render() }
// ... other code omitted for brevity ...
}
字符串
使用内存图分析器,我发现CG光栅数据没有被释放。导致泄漏的特定函数是UIView.asImage(afterScreenUpdates:)。
内存图指示对捕获的视图或图像的强引用正在阻止释放。如何确保这些对象在使用后正确释放?
1条答案
按热度按时间js81xvg61#
我觉得检查一下
1.查看ViewFrame的快照是否正在使用
前)
字符串
2.检查
timer.invalidate()
你在Timer.scheduledTimer的action块中使用了[weak self]。但是在你的代码中没有调用
timer.invalidate()
3.检查
ViewRecordingSession's frames
在
frames
中附加viewFrame后,可能不会在frames
中删除viewFram希望能帮到你祝你今天愉快