Закрытие утечки памяти в UIAlertController - PullRequest
0 голосов
/ 13 декабря 2018

У меня утечка памяти при настройке UIAlertController, я видел другие потоки, говорящие об утечках памяти в UIAlertController.Но я не мог понять, как изменить свой код, чтобы утечка памяти прошла.Я изменил itemSelected с функции на вычисляемое свойство, но это ничего не изменило.

 protocol TriggerUIAlertController: class where Self: UIView {
        var itemsForPresenting: [String] { get }
        var titleForCancel: String { get }
        var titleForAlertController: String { get }
        var itemSelected: Int? {get set}
    }

    extension TriggerUIAlertController {

         func triggerUIAlerController() {
            let alertList = UIAlertController(title: titleForAlertController, message: nil, preferredStyle: .actionSheet)
            let closure = { (alert: UIAlertAction!) -> Void in
                let index = alertList.actions.index(of: alert)
                guard index != nil else {
                    return
                }

                ///produces memory leak, idk why though -> has to be checked
                self.itemSelected = index!
            }
            for x in itemsForPresenting {
                alertList.addAction(UIAlertAction(title: x, style: .default, handler: closure))
            }
            self.window?.rootViewController?.present(alertList,animated: true, completion: nil)
            let cancelAction = UIAlertAction(title: titleForCancel, style: .cancel, handler: nil)
            alertList.addAction(cancelAction)
        }
    }

Кстати: это нормально, что инструменты используют после пяти минут использования в общей сложности 50 ГБ оперативной памяти?

1 Ответ

0 голосов
/ 13 декабря 2018

Это не утечка, вызванная UIAlertController, а в более общем смысле «циклом сохранения», вы можете иметь это с каждым замыканием, которое содержит ссылку на self или любую переменную, созданную вне замыкания.

Вы можете избежать этого, изменив «определение» замыкания:

  let closure = { [weak self, weak alertList] (alert: UIAlertAction!) -> Void in
        guard let self = self, let alertList = alertList, let index = alertList.actions.index(of: alert) else { return }               
            self.itemSelected = index

Здесь можно найти более полное объяснение: Быстрые замыкания, вызывающие сильный цикл удержания с self

Проверка кода: другая реализация замыкания может быть:

  let closure = { [weak self, weak alertList] alert in
        guard let self = self, let alertList = alertList, let index = alertList.actions.index(of: alert) else { 
            return
        }               
        self.itemSelected = index
  }
...