【问题标题】:Why is deinit not called on UITabBarController?为什么没有在 UITabBarController 上调用 deinit?
【发布时间】:2019-02-06 19:49:18
【问题描述】:

我正在学习 Swift。我不会说我是新手,但我敢肯定,就像许多在线学习一样,我错过了很多了解实际情况的基本步骤。

在我的应用程序走得很远之后,我现在发现我的内存管理很差。我正在使用 SDWebImage 缓存,它肯定会受到 GIFS 的影响,但更重要的是,我现在正在学习保留周期和 deinit。

有人能解释一下为什么 UITabBarController deinit 中的 ViewController 永远不会被调用吗?为什么这不是一件坏事? (除非是)并且只是使用标签栏控制器时有关内存管理的一般建议/方向。我已经研究了保留周期以及它们为什么会引起和修复,但根据 xCodes 工具工具,这似乎不是我的问题。

任何建议将不胜感激

谢谢。

【问题讨论】:

  • 你能分享你的代码吗(尤其是这个deinit()和XCode工具的输出?

标签: swift memory uitabbarcontroller deinit


【解决方案1】:

标签栏控制器不会创建和销毁它管理的视图控制器(标签)。它保留所有这些,因此用户可以根据需要在它们之间切换。因此,只要标签栏控制器存在,标签中的视图控制器就会持续存在。

如果您的应用的根视图控制器是一个永远不会消失的标签栏控制器,那么标签的视图控制器也不会消失。

相反,如果您创建一个标签栏控制器并将其推送到导航堆栈上,或者以模态方式显示它,则标签栏控制器将在它被弹出/关闭时被释放,然后视图控制器也将被释放。

【讨论】:

  • 嗨,邓肯,感谢您的快速响应。是的,我也在某处读过。你会说每个选项的情况是什么?即标签栏控制器或从标签栏模态呈现。您是否有理由避免使用标签栏控制器的正常工作方式?
【解决方案2】:

此外,对象可能无法取消初始化的另一个原因是引用。由于您刚刚开始使用 Swift,我强烈建议您查看有关引用周期、ARC(自动引用计数)和内存泄漏的教程。他们会教你
弱变量 以及使用它的适当时间。在开始时,我会说这不是太重要,但在以后尝试获得软件开发工作时它们很有价值。

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 2021-05-16
    • 2016-01-11
    • 2023-03-20
    • 2015-10-21
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多