UIAlertController 内存 leak/issues - Swift

UIAlertController memory leak/issues - Swift

仪器显示简单地打开和关闭警报控制器会导致内存泄漏。

@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)
}

我已将警报缩减为只有一个取消按钮以进行测试。

Edited: Removed deleteAlert.dismissViewController in closure. Fixed retain cycle, but still shows a memory leak. Perhaps a bug.

您的警报操作的完成处理程序强烈引用了您的警报控制器。

您的警报操作强烈引用了它的完成处理程序。

您的警报控制器对警报操作有很强的参考。

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

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

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

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

我发现了同样的问题。

我通过在按钮操作后将警报设置为 null 解决了这个问题:

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