繁体   English   中英

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

[英]property “assign” and “retain” for delegate

对于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不是这个例子的最佳选择,但我已经写了太多。:))

那有意义吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM