启动WKExtendedRuntimeSession时遇运行中对象释放异常求助
问题排查与解决方案
核心原因
报错-[WKExtendedRuntimeSession dealloc]:285: WKExtendedRuntimeObject was dealloced while running的本质是:WKExtendedRuntimeSession实例在仍处于运行状态时,被系统回收释放了。
看你提供的代码,runtimeSession是SessionCoordinator的实例属性,如果SessionCoordinator的实例没有被长期持有(比如只是作为局部变量创建,或者被提前释放),那runtimeSession会随着宿主对象一起被销毁,而此时session还在运行状态,就触发了这个错误。
修复步骤
确保
SessionCoordinator实例被全局持有
把SessionCoordinator的实例存储在不会被轻易释放的位置,比如用单例模式实现:class SessionCoordinator: NSObject, WKExtendedRuntimeSessionDelegate { static let shared = SessionCoordinator() let runtimeSession = WKExtendedRuntimeSession() private override init() { super.init() runtimeSession.delegate = self runtimeSession.start() } // 实现代理方法监控session状态 func extendedRuntimeSession(_ session: WKExtendedRuntimeSession, didInvalidateWith reason: WKExtendedRuntimeSessionInvalidationReason, error: Error?) { // 在这里处理session失效逻辑 } }使用时直接调用
SessionCoordinator.shared,保证实例不会被提前释放。主动管理session生命周期
在session完成任务后,主动调用runtimeSession.invalidate(),再允许相关对象被释放,避免被动回收引发错误;不要在session运行期间,让SessionCoordinator实例失去持有。确认代理对象的稳定性
WKExtendedRuntimeSession对代理是弱引用,要确保SessionCoordinator作为代理不会被提前释放,否则会间接导致session状态异常。
额外注意点
WKExtendedRuntimeSession启动后,必须等到它完成任务或者主动失效,才能让其所在的对象被释放;- 务必实现
WKExtendedRuntimeSessionDelegate的相关代理方法,监控session的状态变化,及时处理失效、错误等情况,避免不可控的内存问题。
内容的提问来源于stack exchange,提问作者Krymskyi Maksym
相关产品推荐
相关产品推荐

