的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()
}
我很困惑在Cell和ViewController之間傳遞消息的實現委託模式的適當方式是什麼。我知道,如果兩個對象強烈地保持彼此的引用,將會有一個保留週期,並且在應用程序生命週期中它們不會被釋放。
在上面的代碼中,ViewController似乎沒有保存Cell的引用。因此,我認爲使用類型A的協議並將ViewController的強引用保存在單元格中並不重要。
但是如果我將委託屬性聲明爲弱引用屬性,我的代碼會更安全嗎?它有什麼含義?
更新:
事實證明,即使是的ViewController未持有細胞&即使TableView中的引用是弱的直接引用,視圖控制器以某種方式持有強引用的單元格。當我遵循方法A時,那是沒有聲明代表是弱引用的。 Cell和ViewController中的deinit方法永遠不會被調用。我也檢查過儀器。如果我不聲明委託人弱,持續保留計數會不斷增加。
現在最大的問題是視圖控制器是如何保持強引用單元格?
我認爲真正的問題是單元格之前的一步:什麼是具有強參考的@IBOutlet?如果它是ViewController,它如何在內部管理保留週期? –
再次用完整的ViewController代碼更新。 –