UIAlertController 没有被释放
UIAlertController not getting deallocated
我创建了一个 UIAlertController 并在其中添加了一个文本字段。问题是在我解除警报控制器后,它没有解除分配并显示在内存图中。
let alertController = UIAlertController(title: "Enter link", message: nil, preferredStyle: .alert)
alertController.addTextField { (textField) in
textField.placeholder = "www.xxx.com"
}
let cancel = UIAlertAction(title: "CANCEL", style: .cancel, handler: nil)
let ok = UIAlertAction(title: "SUBMIT", style: .default) { [weak self] (_) in
guard let self = self else { return }
guard let textFields = alertController.textFields, let textField = textFields.first else { return }
if let text = textField.text {
}
}
alertController.addAction(cancel)
alertController.addAction(ok)
present(alertController, animated: true, completion: nil)
但是,如果我删除 alertController.addTextField
,它就会被释放,并且它不存在于内存图中。
我尝试检查是否由于我的代码引入了任何内存泄漏,但发现 none。
您保留了“ok”警报操作中的 alertController
,该操作又由 UIAlertController
保留。
这是一个保留循环,两个对象都不能相互释放。
你应该避免这种情况,也许可以使用弱引用,即:
let ok = UIAlertAction(title: "SUBMIT", style: .default) { [weak alertController] (_) in
// Upgrade weak to strong reference
guard let alertController = alertController else { return }
// Do your thing
}
我创建了一个 UIAlertController 并在其中添加了一个文本字段。问题是在我解除警报控制器后,它没有解除分配并显示在内存图中。
let alertController = UIAlertController(title: "Enter link", message: nil, preferredStyle: .alert)
alertController.addTextField { (textField) in
textField.placeholder = "www.xxx.com"
}
let cancel = UIAlertAction(title: "CANCEL", style: .cancel, handler: nil)
let ok = UIAlertAction(title: "SUBMIT", style: .default) { [weak self] (_) in
guard let self = self else { return }
guard let textFields = alertController.textFields, let textField = textFields.first else { return }
if let text = textField.text {
}
}
alertController.addAction(cancel)
alertController.addAction(ok)
present(alertController, animated: true, completion: nil)
但是,如果我删除 alertController.addTextField
,它就会被释放,并且它不存在于内存图中。
我尝试检查是否由于我的代码引入了任何内存泄漏,但发现 none。
您保留了“ok”警报操作中的 alertController
,该操作又由 UIAlertController
保留。
这是一个保留循环,两个对象都不能相互释放。
你应该避免这种情况,也许可以使用弱引用,即:
let ok = UIAlertAction(title: "SUBMIT", style: .default) { [weak alertController] (_) in
// Upgrade weak to strong reference
guard let alertController = alertController else { return }
// Do your thing
}