我有两个例子
第一
override func viewDidLoad() {
super.viewDidLoad();
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableView.dataSource = TableViewDataSource();
}
第二
var dataSource:TableViewDataSource!;
override func viewDidLoad() {
super.viewDidLoad();
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
dataSource = TableViewDataSource();
tableView.dataSource = dataSource;
}
第一个例子不起作用但第二个起作用。这些不一样吗?两个例子有什么区别?
答案 0 :(得分:1)
第一个不起作用,因为你必须设置一个强引用
tableView.dataSource = TableViewDataSource();
而另一个人在这里
var dataSource:TableViewDataSource!;
//
如果您查看了dataSource委托实现文件,它就像这样声明
weak open var dataSource:UITableViewDataSource?
无视弱,因此它不会保留分配给它的变量,这就是为什么必须强烈引用其他类实例的原因
答案 1 :(得分:0)
UITableView dataSource
是一个弱小的属性。您的第一个示例不起作用,因为没有对您创建的TableViewDataSource
实例的强引用。到达viewDidLoad
结束时,实例将被取消分配,dataSource
将重置为nil
。
您的第二个示例有效,因为您的类的dataSource
属性保留了对TableViewDataSource
实例的强引用。只要您的视图控制器存在,TableViewDataSource
将存在,并且表视图的数据源将起作用。