代表的“赋值”和“保留”属性

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

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

@property(assign) id delegate; 

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

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

谢谢

文件说:

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

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

那有意义吗?

Interesting Posts