繁体   English   中英

Memory 显示模态视图并关闭它时泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM