属性“分配”和“保留”对于代表
对于 iOS 开发者来说,委托几乎无处不在。
似乎我们需要使用“分配”而不是像这样的委托保留,
@property(assign) id delegate;
原因是为了避免循环问题 为什么 Objective-C 委托通常给出属性分配而不是保留?
我看到了很多代码,他们仍然用了“保留”。所以这里的问题是,如果我们对委托使用retain,我们还会遇到循环问题吗?
谢谢
For iOS developers, delegates are used almost everywhere.
And seems like that we need to use "assign" instead of retain for a delegate like this
@property(assign) id delegate;
The reason is to avoid the circular loop issue Why are Objective-C delegates usually given the property assign instead of retain?
I saw a lot of code and they still used "retain". So the question here is will we still get the circular loop issue if we use retain for a delegate?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
文档 说:
作为示例,让我们考虑一个实现 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 不是这个示例的最佳选择,但我已经写了太多了。:))
这有意义吗?
The documentation says:
As an example, let's consider a UITableViewController that implements UITableViewDelegate protocol. UITableView is retained by it's view controller, although the UITableView does not retain it's delegate.
As said on the document above, UITableViewController will only complete its deallocation when all its strong references get released. Since the UITableView that has the UItableViewController as a delegate doesn't retain it, when the owner of UItableViewController calls release on it, the retain count will go to zero and the dealloc method will get called.
Now imagine that UITableView retains its delegate. UITableViewController will have a retain count of at least +2. One with it's owner and another with UITableView. When UITableViewController's owner calls release on it, the retain count will go to +1, and not to zero as it was expected, and so the dealloc method won't get called until the retain count reaches zero. To reach zero, UITableViewController would need to release its UITableView that would then release its delegate (UITableViewController). Because the UITableViewController will only disposes its view (UITableView) when deallocing this moment would never happen because the retain count won't go bellow +1.
(let's not take in consideration memory warnings and any other possible case...I just saw that ViewController/View is not the best option for this example, but I've written too much already. :))
Does that make sense?