8

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

但是谁能解释我为什么永远不会保留代表?...

提前感谢

4

4 回答 4

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(仍然由另一个对象拥有)
  • 内存泄漏!
于 2012-12-20T12:33:58.370 回答
4

由你决定。如果您声明将其保留(strong在 ARC 中),它将被保留。

规则是不要保留它,因为它已经在其他地方保留了,更重要的是您将避免保留周期

于 2012-12-20T12:32:30.907 回答
2

要扩展 djromero 的答案:

如果您有 aUIViewController其中包含 a UITableView,则控制器很可能会保留该表,它将是它的委托/数据源。如果表保留了委托/数据源,那么它们将相互保留,因此永远不会被释放。

于 2012-12-20T12:34:56.273 回答
1

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

于 2012-12-20T12:33:37.393 回答