App Crash,"Lost Connection"

imp*_*7vx 10 xcode ios avassetexportsession swift

此问题类似,

我有问题,我的应用程序以同样的方式崩溃.我会假设与另一个问题相同的答案:记忆问题; 除了我在AVAssetExportSession调用期间遇到崩溃.

guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }
        exporter.outputFileType = AVFileTypeMPEG4
        exporter.outputURL = url
        exporter.videoComposition = mainComposition
        print("done")

        exporter.exportAsynchronously(completionHandler: {
            DispatchQueue.main.async(execute: {
                self.exportDidFinish(exporter)
                print("removing AI")
                self.removeAI()
                print("removed AI")
                completion()
            })
        })

func exportDidFinish(_ exporter:AVAssetExportSession) {
    if(exporter.status == AVAssetExportSessionStatus.completed) {
        print("cool")
    }
    else if(exporter.status == AVAssetExportSessionStatus.failed) {
        print(exporter.error as Any)
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印"完成"但它从不打印"删除AI".它也不打印"酷"或"(错误)"; 它崩溃并在XCode的顶部说"失去与iPhone的连接......"就像另一个问题所说的那样.

我认为这是一个内存问题,但在异步导出期间(我知道它是如何工作的)之间没有任何事情发生,因为我只是在等待调用完成处理程序.但是之间没有任何东西被调用,我不确定如何处理这个问题.有什么想法吗?

Jak*_*kub 5

我认为AVAssetExportSession在运行异步任务时该对象可能会被释放。考虑将其作为类变量以确保异步块可以完成其任务。它会是这样的:

class myClass {
    var exporter: AVAssetExportSession?

    func export() {
        exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
        guard exporter != nil else { return }
        exporter.outputFileType = AVFileTypeMPEG4
        exporter.outputURL = url
        exporter.videoComposition = mainComposition
        print("done")

        exporter?.exportAsynchronously(completionHandler: { 
            DispatchQueue.main.async {
               self.exportDidFinish(exporter)
               print("removing AI")
               self.removeAI()
               print("removed AI")
               completion()
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的不确定为什么你也把所有东西都放在完成块的主线程上,但也许你想稍后用 UI 做一些事情,所以我把它留在那里。

但最重要的是 - 让你AVAssetExportSession不存储在可能释放它的方法上。这是可能导致此问题的内存问题。


Hon*_*ney 3

我以前也遇到过这个问题,这对我来说不是内存问题。我不知道我到底是如何解决的,但我做了这些事情:

我删除了应用程序,硬重置手机,清理了 Xcode 上的构建,重新启动了 Xcode,删除了派生数据,如果我没记错的话,更改了 USB 端口,直到它得到修复。

我还打开了控制台和虚拟机,我也关闭了它们。