【问题标题】:Memory leak swift内存泄漏迅速
【发布时间】:2015-05-28 16:06:13
【问题描述】:

我正在试验 Swift 中的内存泄漏,我想在调用 didReceiveMemoryWarning() 函数时清除内存。

我的应用底部有一个标签栏,每个标签栏都有自己的navigationController。从这个控制器,视图被推送到堆栈上。

如果我收到内存警告,我会弹出导航控制器中的每个视图(参见示例)

override func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()

    for var i = viewControllers.count; i > 0; i-- {
        popViewControllerAnimated(false);
    }        
}

所有视图都被成功移除并显示了每个选项卡的“根视图”,但是直到我再次按下选项卡时内存才会释放。

有人知道我做错了什么吗?

【问题讨论】:

  • “但是内存不会释放”——你怎么知道?
  • “我用 IOS 模拟器测试了内存使用情况,如果我使用 navigationController?.popViewControllerAnimated(true) 弹出视图,内存会减少,如果我在另一个选项卡中弹出它们不会减少”
  • @Spidfire 你找到解决方案了吗?

标签: ios swift memory-leaks


【解决方案1】:

首先,您不应该将视图控制器从堆栈中弹出,因为 iOS 擅长内存管理,并且在不需要视图时会自动释放视图。

其次,您会收到内存警告,因为您可能正在创建引用循环,因为您正在使用对视图控制器的强引用。尝试使用可以解决问题的弱引用。

这解释了 swift 中的内存管理,还解释了如何创建引用循环以及如何使用弱关键字来防止内存循环。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

【讨论】:

  • “感谢您的快速回复,我阅读了这篇文章,它给了我很多有用的信息。我知道了解有关参考周期的概念。我找不到这个循环的可能原因。我不明白为什么在当前标签中弹出有效,而从另一个标签中弹出则无效。 (在我看来,没有循环,因为弹出当前选项卡确实有效,因为那样这也应该失败)。上述视图类中也没有引用回的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2017-01-09
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多