【问题标题】:UIAlertController memory leak/issues - SwiftUIAlertController 内存泄漏/问题 - Swift
【发布时间】:2015-08-09 17:23:18
【问题描述】:

Instruments 显示了由于简单地打开和关闭警报控制器而导致的内存泄漏。

@IBAction func delBtnAc(sender: AnyObject) {

    let deleteAlert = UIAlertController(title: "Delete Image?", message: "", preferredStyle: .Alert)

    let cancelIt = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)

    deleteAlert.addAction(cancelIt)
    presentViewController(deleteAlert, animated: true, completion: nil)
}

我已将警报减少为仅用于测试的取消按钮。

已编辑:在关闭时删除了 deleteAlert.dismissViewController。修复了保留周期,但仍显示内存泄漏。也许是一个错误。

【问题讨论】:

  • 您不需要在您的操作中关闭警报控制器。它会自行消失...
  • 我只是为了阻止内存泄漏。它看起来像一个创可贴。内存泄漏是错误吗?
  • 正如您从我发布的答案中看到的那样,这实际上是造成内存泄漏

标签: ios swift memory-leaks uialertcontroller


【解决方案1】:

您的警报操作的完成处理程序对您的警报控制器有很强的引用。

您的警报操作对其完成处理程序有很强的引用。

您的警报控制器对警报操作有很强的引用。

所以这里我们有一个经典的保留周期。

问题在于完成处理程序对警报控制器本身的强引用,在这种情况下,这恰好是完全没有必要的。警报控制器在运行适当的完成处理程序后自行关闭。

我们可以完全消除这条线。

如果我们在完成处理程序中做一些非冗余的事情,我们需要创建对完成处理程序的弱引用,以便我们可以在完成处理程序中使用它。

【讨论】:

  • 用 let cancelIt = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 替换动作。我仍然有泄漏。
  • 如果您在没有保留周期的情况下仍然看到泄漏,那么它可能是警报控制器的错误。或者它甚至可能是仪器的一个错误(仪器肯定有错误)。无论哪种方式,如果您确定自己没有保留周期,则可能值得向 Apple 发布错误报告。
  • 仍然显示泄漏,可能是一个错误。感谢您的帮助。
  • 如果有人在 2016 年遇到这个问题。在 set handler = nil 之后我仍然有泄漏,就像 @agent86 一样。我发现在出现之前设置 alertController 的“tintColor”会导致问题(例如 deleteAlert.view.tintColor = xxx)。在“presentViewController”为我解决问题之后删除或移动它。这很奇怪,但这是我所做的唯一更改。不知道设置其他属性会不会出现同样的问题。
【解决方案2】:

我发现了同样的问题。

我通过在按钮操作后将警报设置为 null 来解决它:

deleteAlert = null 在您的取消按钮操作中

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 2015-08-20
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多