【发布时间】:2018-01-28 09:01:42
【问题描述】:
类似于这个this question,
我遇到了问题,我的应用也以同样的方式崩溃。我会假设与另一个问题相同的答案:内存问题;除了我在 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)
}
}
它会打印“done”,但从不打印“removing AI”。它也不打印“cool”或“(error)”;正如另一个问题所述,它崩溃并在 XCode 顶部显示“丢失与 iPhone 的连接......”。
我认为这是一个内存问题,但在异步导出期间(据我所知这是如何工作的)之间没有发生任何事情,因为我只是在等待调用完成处理程序。但是中间没有任何东西被调用,我不确定如何处理这个问题。有什么想法吗?
【问题讨论】:
-
试着放try,catch块,然后贴出crash的堆栈信息?
-
嗯。如果你参考了上面的帖子,你会发现没有办法抓住它。它只是崩溃并说它无法连接到设备。应用程序崩溃。没有日志,它没有向我显示“问题”。这就是为什么我从另一篇文章中假设它可能是记忆。
-
为了能够更好地帮助您,我建议您创建重现问题的最小代码,以便我们也可以对其进行测试。此外,我建议一种启发式方法,即:删除一些代码块,看看它是否失败......如果没有,则将那部分放回原处并删除代码的另一部分或更多部分,直到它不崩溃.然后您也许能够确定问题的根源
-
这听起来不错,但崩溃并非每次都发生。很难测试这样的能力。
-
我使用 Instruments 中的内存分配模板解决了一个类似的问题,以查找哪个方法分配了大量内存。即使不是每次都崩溃,它也可以帮助您找出问题所在。
标签: ios swift xcode avassetexportsession