[英]Memory leak when displaying a modal view and dismissing it
当 AVExportSession 完成导出后,我的应用程序会显示一个模态视图,其中显示视频和一组图像。 关闭模态视图并使其一遍又一遍地显示会显示 memory 不断增长。 我怀疑可能会出现一个强大的参考周期。
我在模态视图(manageCaptureVC)上设置所需的变量。 fileURL 是一个全局变量,manageCaptureVC 可以从中读取以获取视频。 当模态视图被关闭时,基于 URL 的视频被删除。 泄漏更大,具体取决于在模态视图中捕获和显示的媒体的大小。
我使用了泄漏仪器。 不幸的是,它从来没有指向我的任何功能。 它显示了显示汇编语言的 memory 地址。 我也在使用设备。
这是我的泄漏仪器的屏幕截图,在我显示和关闭我的视图时,仪器指示泄漏:
在我的情况下,有什么明显的可能导致泄漏的吗?
呈现模态视图 (manageCaptureVC)
// video done exporting
guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }
exporter.outputURL = mainVideoURL
exporter.outputFileType = AVFileType.mov
let manageCaptureVC = self.storyboard?.instantiateViewController(withIdentifier: "ManageCaptureVC") as! ManageCaptureVC
exporter.exportAsynchronously(completionHandler: {[weak self]
() -> Void in
let fileManagement = FileManagement()
fileManagement.checkForAndDeleteExportFile() // delete export file
self?.myTimer.invalidate()
fileURL = mainVideoURL
guard let imgCaptureModeRawVal = self?.imageCaptureMode.rawValue else { return }
manageCaptureVC.imageCaptureMode = ManageCaptureVC.imageCaptureModes(rawValue: imgCaptureModeRawVal)!
manageCaptureVC.delegate = self
DispatchQueue.main.async(){
manageCaptureVC.modalPresentationStyle = .fullScreen
self?.present(manageCaptureVC, animated: true, completion: nil)
}
})
关闭视图:
func goBackTask(){
// turn off manage capture tutorial if needed
if debug_ManageCaptureTutorialModeOn {
debug_ManageCaptureTutorialModeOn = false
delegate?.resetFiltersToPrime()
}
// no longer ignore interface orientation
ignoreSelectedInterfaceOrientation = false
// remove observer for the application becoming active in this view
NotificationCenter.default.removeObserver(self,
name: UIApplication.didBecomeActiveNotification,
object: nil)
if let videoEndedObs = self.videoEndedObserver {
NotificationCenter.default.removeObserver(videoEndedObs)
}
// invalidate thumb timer
thumbColorTimer.invalidate()
// empty UIImages
uiImages.removeAll()
// delete video
let fileManagement = FileManagement()
fileManagement.checkForAndDeleteFile()
let group = DispatchGroup()
group.enter()
DispatchQueue.main.async {
self.enableButtons(enabled:false)
if let p = self.player, let pl = self.playerLayer {
p.pause()
pl.removeObserver(self, forKeyPath: "videoRect")
pl.removeFromSuperlayer()
p.replaceCurrentItem(with: nil)
}
group.leave()
}
let group2 = DispatchGroup()
group.notify(queue: .main) {
group2.enter()
DispatchQueue.main.async {
self.enableButtons(enabled:true)
group2.leave()
}
}
group2.notify(queue: .main) {
self.dismiss(animated: true)
}
}
我也遇到过这个问题。 我花了几天时间才找到它。 将 modalPresentationStyle 设置为 .fullScreen 导致 View Controller 未发布。 我能够在一个非常简单的例子中重现这一点。 我通过将 modalPresentationStyle 设置为.currentContext 来解决它。 没有任何仪器识别出这个保留周期——我猜是因为它是在低级 Apple 代码中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.