UIAlertController 内存泄漏/问题 - Swift

age*_*t86 1 memory-leaks ios swift uialertcontroller

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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

nhg*_*rif 5

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

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

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

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

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

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

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

  • 万一有人在 2016 年遇到这个问题。 set handler = nil 后我仍然有泄漏,就像@agent86 一样。我发现在出现之前设置 alertController 的“tintColor”会导致问题(例如 deleteAlert.view.tintColor = xxx)。在“presentViewController”为我解决问题后删除或移动它。这很奇怪,但这是我所做的唯一更改。不知道设置其他属性会不会出现同样的问题。 (3认同)