16

对于 iOS 开发人员,委托几乎无处不在。

似乎我们需要为这样的委托使用“分配”而不是保留

@property(assign) id delegate;

原因是为了避免循环循环问题为什么 Objective-C 委托通常赋予属性分配而不是保留?

我看了很多代码,他们仍然使用“保留”。所以这里的问题是,如果我们对委托使用保留,我们还会遇到循环循环问题吗?

谢谢

4

1 回答 1

26

文档说:

保留一个对象会创建一个强引用,并且一个对象在其所有强引用都被释放之前不能被释放。如果两个对象相互保留,则两个对象都不会被释放,因为它们之间的连接不会被破坏

作为一个例子,让我们考虑一个实现 UITableViewDelegate 协议的 UITableViewController。UITableView 由它的视图控制器保留,尽管 UITableView 不保留它的委托。

如上面文档所述,UITableViewController 只有在其所有强引用都被释放时才会完成其释放。由于以 UItableViewController 作为委托的 UITableView 不保留它,因此当 UItableViewController 的所有者对其调用 release 时,保留计数将变为零,并且将调用 dealloc 方法。

现在想象 UITableView 保留了它的委托。UITableViewController 的保留计数至少为 +2。一个是它的所有者,另一个是 UITableView。当 UITableViewController 的所有者对其调用 release 时,保留计数将变为 +1,而不是预期的为零,因此在保留计数达到零之前不会调用 dealloc 方法。为了达到零,UITableViewController 需要释放它的 UITableView,然后释放它的委托(UITableViewController)。因为 UITableViewController 只会在释放时释放其视图(UITableView),所以这一刻永远不会发生,因为保留计数不会低于 +1。

(让我们不要考虑内存警告和任何其他可能的情况......我刚刚看到 ViewController/View 不是这个例子的最佳选择,但我已经写了太多了。:))

那有意义吗?

于 2011-03-03T03:45:18.233 回答