代理人的“分配”和“保留”属性

时间:2011-03-03 03:15:29

标签: ios delegates properties retain assign

对于iOS开发人员,代理几乎无处不在。

似乎我们需要使用“assign”而不是像这样的委托来保留

@property(assign) id delegate;

原因是避免循环循环问题Why are Objective-C delegates usually given the property assign instead of retain?

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

由于

1 个答案:

答案 0 :(得分:26)

documentation说:

  

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

作为一个例子,让我们考虑一个实现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不是这个例子的最佳选择,但我已经写了太多了。:))

这有意义吗?