【问题标题】:property "assign" and "retain" for delegate代表的属性“分配”和“保留”
【发布时间】:2011-07-07 18:28:59
【问题描述】:

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

对于这样的委托,我们似乎需要使用“分配”而不是保留

@property(assign) id delegate;

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

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

谢谢

【问题讨论】:

    标签: ios delegates properties retain assign


    【解决方案1】:

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

    这有意义吗?

    【讨论】:

    • 是的,非常有意义,非常感谢!在您的情况下,A 是 UITableViewController,B 是 TableView,所以唯一正确的方法是在 TableView 中使用“分配”作为委托。考虑另一种常见的情况,A是ViewController,B是另一个ViewController,A新建一个B,在B中使用retain作为delegate,A也可以释放B,所以这种情况下retain是可以的B 中的委托。这有意义吗?
    • 没听懂。你说 A 创建 B,A 使用 B 作为某事的委托,所以,A.viewController(retain) = B,A.delegate(assign) = B。或者 A 是 B 的委托,所以,A。 viewController(retain) = B,和 B.delegate(assign) = A?是哪一种?
    • 关于 A 和 B 的上下文来自于链接 为什么 Objective-C 委托通常赋予属性分配而不是保留?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2011-06-15
    • 1970-01-01
    • 2016-12-14
    • 2019-06-16
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多