如何在Objective-C中处理引用副本?

时间:2010-06-09 10:04:57

标签: objective-c memory-management

对象图

      [Instance A]
         tree
       /       \
      /         \
     /           \
    ↓             ↓
[Instance B]     [Instance C]
 apple              bug

问题

实例A 必须将副本引用到实例B 实例C

如果我保留或发布 Instance A ,它引用了其他两个实例,那么各种引用计数会发生什么变化?

3 个答案:

答案 0 :(得分:1)

保留或释放A时,只会更改其引用计数。 B和C会发生什么取决于您的模型和实施。

如果A“拥有”或需要保持B / C,它应该在某个时刻保留它(独立于A本身被保留),并在A被解除分配时释放它。

如果您没有实施A,则需要检查文档以查看它是否拥有B / C,或者您需要明确保留和释放它们。

我检查了您的原始问题,不确定这是否是您正在寻找的答案。如果没有,请解释一下......

答案 1 :(得分:1)

您不关心保留计数。不,老实说,你没有。你只关心A是否拥有B和C(或者更确切地说,是否拥有B和C的所有权)。

所以可能在某个地方你有一个方法来设置A的孩子(它可能是A的指定初始化者)。如果该方法保留B和C,那么当A不再需要所有权时,A必须释放B和/或C.这将在两种情况下:

  1. 当B和/或C要被新孩子覆盖时
  2. 当A即将被解除分配时
  3. 无论如何,说完了,回答你的问题:

    如果保留A,它对B和C的保留计数没有影响。

    如果你释放A,它对B和C 的保留计数没有影响,除非没有其他人拥有A的所有权。在这种情况下,将调用A的dealloc,这将释放B和C.

答案 2 :(得分:0)

当你在objectA上调用retain或release时,持有objectA引用的对象不会发生任何事情。 (除非你已经覆盖了这些方法。)(保留增加保留计数和释放减少保留计数)

如果保留计数变为0,则会释放dealloc并释放objectA。并且您负责释放类的已分配对象。仍然持有objectA引用的其他对象成为悬空指针。

此致 Dhana。