Какое управление памятью подходит для закрытия UITableViewRowAction? - PullRequest
0 голосов
/ 16 февраля 2019

Является ли мое использование unowned for self и ни слабым, ни unowned для tableView целесообразным в следующем контексте?

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    let delete = UITableViewRowAction(style: .destructive, title: "Delete") { [unowned self] (action, indexPath) in
        self.habitsManager.remove(at: indexPath.row)
        self.adjustForRowCount()
        tableView.deleteRows(at: [indexPath], with: .fade)
        tableView.reloadData()
    }

    return [delete]
}

1 Ответ

0 голосов
/ 17 февраля 2019

Я не думаю, что вам нужно capture list в этой ситуации.

Время, когда используется список захвата, - это когда мы создаем сильный ссылочный цикл, что означает, что эти объекты указывают друг на друга иARC считает, что они все еще используются, поскольку счет не 0.

В ситуации editActionsForRowAt замыкание не указывает ни на что другое, только на блок кода, который должен быть выполнен.

При нажатии одной из кнопок действий выполняется сохраненный блок обработчика.с объектом действия.

Подробнее о editActionsForRowAt здесь

В заключение безопасно удалить [unowned self], поскольку вы не используетеaction, вы можете заменить его на _, чтобы сделать его чище.И вам также не нужно звонить tableView.reloadData() здесь.

let delete = UITableViewRowAction(style: .destructive, title: "Delete") {(_, indexPath) in
    self.habitsManager.remove(at: indexPath.row)
    self.adjustForRowCount()
    tableView.deleteRows(at: [indexPath], with: .fade)
}

Кстати, в документе Swift есть несколько замечательных примеров того, как работает ARC и когда использовать список захвата.Вы можете проверить это также. Link

...