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 никогда не вызываются. Я тоже проверил инструменты. Постоянный показатель сохранения увеличивается, если я не объявляю делегата слабым.
Теперь главный вопрос заключается в том, как ViewController держит сильную ссылку на клетки?
Я думаю, что настоящие вопросы - это шаг перед ячейками: что такое @IBOutlet с сильной ссылкой? И если это ViewController, как он управляет циклом сохранения внутри? –
Обновлен с полным кодом ViewController. –