首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >委派的"assign“和"retain”属性

委派的"assign“和"retain”属性
EN

Stack Overflow用户
提问于 2011-03-03 11:15:29
回答 1查看 24.5K关注 0票数 16

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

并且看起来我们需要使用“赋值”而不是像下面这样的委托的保留。

代码语言:javascript
复制
@property(assign) id delegate;

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

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

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

这有意义吗?

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5176261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档