UIAlertController не освобождается

#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
}