App Crash, "Lost Connection"

11

类似于这个问题

我也遇到了问题,我的应用程序以相同的方式崩溃。我认为答案与其他问题相同:内存问题;但是在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块,并发布崩溃的堆栈跟踪? - Saket Kumar
1
如果您参考了上面的帖子,您会发现没有办法捕获它。它只是崩溃并显示无法连接到设备。应用程序也会崩溃。没有日志,也没有显示给我任何“问题”。这就是为什么我认为根据其他帖子所述,可能是内存问题。 - impression7vx
为了更好地帮助您,我建议您创建最小的代码以重现问题,以便我们也可以测试它。此外,我建议使用一种启发式方法:您可以删除一些代码块并查看是否失败...如果没有失败,则将该部分放回并删除另一部分或更多部分的代码,直到它不崩溃。然后,您可能能够确定问题的源头。 - mfaani
你在日志中至少收到了一条内存警告吗? - Sakshi
你在项目中加载任何GIF或高分辨率图像吗? - Hitesh Surani
显示剩余2条评论
2个回答

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()
           }
        }
    }
}

我真的不确定为什么你在完成块中也将所有内容放在主线程上,但可能您稍后想要做一些与UI相关的事情,所以我将其留在那里。

但最重要的是 - 确保您的AVAssetExportSession不存储在可能释放它的方法中。这是可能导致内存问题的。


你认为这会像其他问题中讨论的那样完全导致崩溃吗?我认为这可能会导致某些东西为空而出现问题。在完成块内,我需要处理很多UI相关的操作,因此我需要主线程。这是大多数完成块都具有的特点(根据我的经验)。 - impression7vx
是的,之前处理过那个问题。但当我使用 CoreLocation 时,它提供了一个错误并说找不到,有一个崩溃日志。这只是显示“设备与 XCode 断开连接”。 - impression7vx
是的,为了测试是否存在问题,您甚至可以将myClass作为变量存储在AppDelegate中,以确保它不会被释放,但如果这样可以解决问题,请将其移动:D - Jakub
这个答案仍然不合理,因为崩溃并不是每次都发生。理论上,导出器应该在每次被释放时引起问题。 - impression7vx
“从理论上讲,每次出现问题时都应该释放出口程序”,这是不正确的。您无法控制对象何时从内存中被释放。这就是大多数情况下出现“有时发生”问题的原因。 - Jakub
显示剩余3条评论

3

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

我删除了应用程序,在手机上进行了硬重置,清理了Xcode上的构建,重新启动了Xcode,删除了派生数据,并且如果我记得正确,更改了USB端口直到问题解决。

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


这种情况发生在测试飞行/从计算机运行以及多个设备上,包括模拟器和测试人员的手机。 - impression7vx
@impression7vx 哦,奇怪。请把这个信息添加到你的问题中,因为我以为这只发生在设备上。但是我不知道更多了。 - mfaani
当我说“类似于这个问题”时,另一个问题立即说明“我的应用程序崩溃了,我需要一些建议来查找和解决问题。这不是设备或电缆问题,因为它在所有设备上都发生,而不仅仅是在调试时发生”。没有必要完全重述问题以适应我的条件。 - impression7vx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接