是否保留了代表?

时间:2012-12-20 12:29:36

标签: objective-c ios xcode

我知道,代表永远不会被保留!永远!

但任何人都可以解释为什么委托永远不会被保留?...

提前完成

4 个答案:

答案 0 :(得分:14)

这是一个记忆管理的事情。

Objective-C使用引用计数来保持内存清洁。这确实意味着它无法检测循环关系。

示例:

  • 对象A拥有对象B.对象B由对象A保留。
  • 对象B具有作为对象A的委托。对象A由对象B保留。
  • 对象C拥有对象A.对象A由对象C保留。
  • 对象A现在的retainCount为2,而对象B的retainCount为1
  • 对象C被释放,并释放对象A
  • 对象A和B现在的retainCount为1,因为它们彼此拥有。系统不会释放它们,因为retainCount仍为1(仍由另一个对象拥有)
  • 内存泄漏!

答案 1 :(得分:3)

这取决于你。如果您声明要保留(ARC中为strong),则会保留它。

规则是不保留它,因为它已经保留在别处,更重要的是你将避免保留周期

答案 2 :(得分:2)

扩展djromero的答案:

如果您的UIViewController包含UITableView,则控制器很可能会保留该表,它将是它的委托/ dataSource。如果表保留了委托/ dataSource,那么它们将相互保留,从而永远不会被释放。

答案 3 :(得分:1)

整个想法是委托应该总是比将其指定为委托的对象更长。因此,webview将在分配的代表之前发布。