这些swift代码行有何不同?

这些swift代码行有何不同?,swift,Swift,而不是直接通过以下方式调用它: let fakeDataSource = FakeDataSource() tableView?.dataSource = fakeDataSource 第二个示例因NSException崩溃,但第一个示例编译并工作。我看不出有什么不同。如果您需要粘贴更多代码,请告诉我。两者都有问题,但第一种可能会更好,简单地说 UITableView数据源是一个弱属性。因此,除非其他对象对数据源对象具有强引用,否则数据源将变为nil 在第一组代码中,FakeDataSour

而不是直接通过以下方式调用它:

let fakeDataSource = FakeDataSource()

tableView?.dataSource = fakeDataSource

第二个示例因NSException崩溃,但第一个示例编译并工作。我看不出有什么不同。如果您需要粘贴更多代码,请告诉我。

两者都有问题,但第一种可能会更好,简单地说

UITableView数据源
是一个
属性。因此,除非其他对象对数据源对象具有强引用,否则数据源将变为
nil

在第一组代码中,
FakeDataSource
实例由
FakeDataSource
变量保存。因此,
FakeDataSource
实例将一直存在,直到
FakeDataSource
变量超出范围

在第二组代码中,
FakeDataSource
创建并分配在一行中。在该行之后,不再有任何对
FakeDataSource
实例的强引用,因此它就在那里被解除分配,
dataSource
几乎立即变为
nil

在这两种情况下,都存在一个问题。唯一的区别是,
FakeDataSource
实例被释放的时间


两者的修复方法相同。保持对
FakeDataSource
实例的强引用。这通常是通过使用属性来完成的。

两者都是一个问题,但第一个可能会更好,简单地说

UITableView数据源
是一个
属性。因此,除非其他对象对数据源对象具有强引用,否则数据源将变为
nil

在第一组代码中,
FakeDataSource
实例由
FakeDataSource
变量保存。因此,
FakeDataSource
实例将一直存在,直到
FakeDataSource
变量超出范围

在第二组代码中,
FakeDataSource
创建并分配在一行中。在该行之后,不再有任何对
FakeDataSource
实例的强引用,因此它就在那里被解除分配,
dataSource
几乎立即变为
nil

在这两种情况下,都存在一个问题。唯一的区别是,
FakeDataSource
实例被释放的时间


两者的修复方法相同。保持对
FakeDataSource
实例的强引用。这通常通过使用属性来完成。

这有助于更好地理解ARC起作用时的解除分配。非常感谢!您是如何知道UITableView数据源是一个弱属性的?我通过查看其文档了解到:
弱变量数据源:UITableViewDataSource?{get set}
。这有助于更好地理解ARC起作用时的释放。非常感谢!您是如何知道UITableView数据源是一个弱属性的?我通过查看其文档了解到:
弱变量数据源:UITableViewDataSource?{get set}
tableView?.dataSource = FakeDataSource()