对于iOS开发人员来说,委托几乎无处不在。
并且看起来我们需要使用“赋值”而不是像下面这样的委托的保留。
@property(assign) id delegate;原因是为了避免Why are Objective-C delegates usually given the property assign instead of retain?的循环问题
我看到了很多代码,他们仍然使用"retain“。所以这里的问题是,如果我们对委托使用retain,我们还会得到循环问题吗?
谢谢
发布于 2011-03-03 11:45:18
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不是这个例子的最佳选择,但我已经写了太多了。:)
这有意义吗?
https://stackoverflow.com/questions/5176261
复制相似问题