iOS-Swift-UIViewController页面销毁和释放资源
UIViewController 的生命周期有个奇怪的地方,就是有页面加载的方法 viewDidLoad()
,却没有页面销毁的方法。只有一个 deinit{}
,它代表的是对象的销毁。然而关闭页面时,对象不一定会销毁。
如果在deinit{}
里面去释放资源,资源没释放导致内存泄漏,那么deinit{}
不会被调用;deinit{}
不被调用就释放不了资源。这就造成了死循环。
解决方式是重新找一个页面销毁的方法:viewDidDisappear(_ animated: Bool)
,当然这个方法被调用时页面不一定被销毁了,也可能是在当前页面上面启动了新页面。区分这两种情况的方法是判断当前页面的 navigationController == nil
,是 nil
代表当前页面真正销毁。
override func viewDidDisappear(_ animated: Bool) {
if self.navigationController == nil {
viewDidClose()
}
}
// 页面真正销毁
open func viewDidClose() {
// no op
}
Android里也有相似的问题,虽然Activity有onDestroy回调方法,但是它在页面销毁时不一定能被及时调用,如果有一些资源释放比较耗时,onDestroy可能会延迟很多秒。解决方式也相似:在onPause回调里判断isFinishing(),true代表页面将要销毁。
分类:
iOS
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性