2016-08-25 2 views
1

ViewController КодДолжен ли я делегировать пользовательскую ячейку как слабосвязанный proprety?

class ViewController: UIViewController { 
    deinit { 
     print("ViewController deinitialised") 
    } 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     self.tableView.dataSource = self 
    } 

    func didTapBlue() { 

    } 
} 

extension ViewController: UITableViewDataSource, CustomCellDelegate { 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 5 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! CustomCell 
     cell.delegate = self 
     cell.textLabel!.text = "\(indexPath.row)" 
     return cell 
    } 

    func buttonTapped() { 
     print("Button tapped") 
    } 
} 

CustomCell Код

class CustomCell: UITableViewCell { 
    deinit { 
     print("Cell deinitialised") 
    } 

    var delegate: CustomCellDelegate! //When protocol Type is A 
    // weak prefix when protocol Type is B 
    // weak var delegate: CustomCellDelegate! 

    @IBAction func buttonClickAction(sender: AnyObject) { 
     if let del = self.delegate { 
      del.buttonTapped() 
     } 
    } 
} 

Протокол Тип A

protocol CustomCellDelegate{ 
    func buttonTapped() 
} 

Тип протокола B

protocol CustomCellDelegate: class { 
    func buttonTapped() 
} 

Я смущен о том, что соответствующий способ реализации делегата шаблона для передачи сообщения между клеткой и ViewController. Я знаю, что если два объекта сильно поддерживают ссылку друг друга, будет цикл сохранения, и они не будут освобождены в течение срока действия приложения.

В приведенном выше коде ViewController, похоже, не содержит ссылки на Cell. Поэтому я думаю, что не имеет значения, использую ли я протокол типа A и сохраняю сильную ссылку на ViewController в ячейке.

Но будет ли мой код более безопасным, если я объявлю свойство делегата как свойство с низкой ссылкой? Каковы последствия этого?

Update:

Оказывается, что даже если ViewController не держит прямую ссылку на ячейку &, даже если ссылка Tableview слаба, ViewController как-то держит сильную ссылку на клетки. Когда я следую методу A, то есть без объявления делегата слабой ссылки. Методы deinit в Cell и ViewController никогда не вызываются. Я тоже проверил инструменты. Постоянный показатель сохранения увеличивается, если я не объявляю делегата слабым.

enter image description here

Теперь главный вопрос заключается в том, как ViewController держит сильную ссылку на клетки?

+0

Я думаю, что настоящие вопросы - это шаг перед ячейками: что такое @IBOutlet с сильной ссылкой? И если это ViewController, как он управляет циклом сохранения внутри? –

+0

Обновлен с полным кодом ViewController. –

ответ

0

деинициализация Процесс:

Когда контроллер зрения выскочил. Затем вызывается метод deinit.

Затем удаляются только все остальные ссылки, которые удерживает контроллер.

Родители деинируют триггеры, триггеры дефиниции ребенка, после чего все деиниты пройдены, а затем освобождение родителя завершается наконец.

Если какой-либо ребенок сильно ссылается на родителя. Деинит родителя никогда не вызывается, и весь процесс деинициализации останавливается. В нашем случае, поскольку ячейка сильно удерживает контроллер представления. Метод deinit ViewController никогда не вызван. Следовательно, цикл сохранения. Вот отличное объяснение для retain cycle.

1

Есть пара вещей, происходящих там.

  1. Изготовление каждый ViewController соответствует UITableViewDelegate и UITableViewDataSource Излишне, так как у вас уже есть UITableViewController и вам, вероятно, нужно переопределить эти методы в любом случае. В какой-то момент жизненного цикла разработки вы будете дублировать код.

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

+0

Также обратите внимание, что поскольку 'buttonTapped' не передает себя, нелегко узнать, какая кнопка была нажата. –

+0

@MatthewSeaman Вы правы. Было бы трудно сказать, но опять же ... ему, вероятно, придется все равно переопределить всю реализацию. –

+1

Код, показанный здесь, был предназначен только для демонстрации. Просмотрите приведенные выше обновления. –

Смежные вопросы