iOS中不调用stop()如何避免Firebase Trace内存泄漏?
解决Firebase Performance Trace取消时的内存泄漏与无效上报问题
我来帮你搞定这个问题!你担心直接把Trace实例置为nil不够稳妥是对的——Firebase内部会持有未停止的trace引用,单纯置nil无法让它释放资源,确实可能导致内存泄漏,同时如果不小心调用stop()又会上报无效的中途取消数据。
官方推荐的解决方案:使用abort()方法
Firebase Performance Monitoring的Trace类专门提供了abort()方法,它的作用就是终止未完成的trace、释放相关资源,并且不会将该trace的数据上报到后台,完全匹配你的需求。
修改后的代码实现
你可以在现有类中新增一个取消追踪的方法,结合abort()和置nil操作:
import FirebasePerformance private var passwordResetTrace: Trace? func startPWResetTrace() { // 先确保之前的trace被清理(防止重复启动) cancelPWResetTrace() passwordResetTrace = Performance.sharedInstance().startTrace(name: "passwordTimeTrace") } func stopPWResetTrace() { passwordResetTrace?.stop() passwordResetTrace = nil // 释放本地引用 } func cancelPWResetTrace() { passwordResetTrace?.abort() // 终止trace且不上报数据 passwordResetTrace = nil // 释放本地引用 }
关键说明
abort()是Firebase官方提供的安全终止未完成trace的方式,会清理Firebase内部对该trace的持有引用,从根源避免内存泄漏。- 在启动新trace前调用
cancelPWResetTrace(),可以防止用户多次触发重置流程导致多个未处理的trace实例存在。 - 无论调用
stop()还是abort()后,都将passwordResetTrace置为nil,确保你的类不再持有该实例的引用,双重保障内存安全。
内容的提问来源于stack exchange,提问作者K81
相关产品推荐
相关产品推荐

