#swift #swift5 #uialertcontroller #uialertaction
Вопрос:
Я создал UIAlertController и добавил в него текстовое поле. Проблема в том, что после того, как я отключаю alertcontroller, он не освобождается и отображается на графике памяти.
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
его, он будет освобожден, и его не будет в графике памяти.
Я попытался проверить, нет ли каких-либо утечек памяти из-за моего кода, но не нашел ни одной.
Комментарии:
1. Что вы делаете на 9-й и 10 — й строках?
2. Доступ к тексту, написанному в полях @ElTomato
3. @NitantaAdhikari, пожалуйста, следуйте этому hackingwithswift.com/example-code/uikit/…
Ответ №1:
Вы сохраняете 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
}