微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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代表页面将要销毁。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐