Утечка памяти при отображении модального вида и его отклонении - PullRequest
0 голосов
/ 26 сентября 2019

Когда AVExportSession завершает экспорт, мое приложение отображает модальное представление, отображающее видео и массив изображений.Отказ от модального представления и его повторное отображение снова и снова показывают увеличение памяти, которое постоянно увеличивается.Я подозреваю, что может произойти сильный ссылочный цикл.

Я устанавливаю необходимые переменные в модальном представлении (manageCaptureVC).fileURL - это глобальная переменная, из которой manageCaptureVC может прочитать видео.Видео удаляется на основе этого URL, когда модальное представление закрывается.Утечка больше в зависимости от размера носителя, который захватывается и отображается в модальном представлении.

Я использовал инструмент утечки.К сожалению, это никогда не указывает ни на одну из моих функций.Он показывает адреса памяти, которые отображают язык ассемблера.Я также использую устройство.

Вот снимок экрана моего прибора для обнаружения утечек в точке, где я отображаю и отклоняю свой вид, и инструмент показывает утечки:

enter image description here

Что-нибудь очевидное, что может вызвать утечку в моем случае?

Представление модального представления (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)
    }

}
...