保留对象的数量

时间:2017-04-01 18:54:34

标签: ios objective-c

我在iOS和MRC的MRC中有一个查询我有点困惑。假设我有两个对象ObjectA&具有以下相同类型的ObjectB保留计数

  1. ObjectA:保留计数为1
  2. ObjectB:reatin count 0
  3. 现在我正在执行操作

    ObjectB = [ObjectA retain];
    

    任何人都可以告诉我什么会保留ObjectA&对象B?

    据我所知,保留ObjectA = 2& ObjectB = 1。

    如果我错了,请纠正。如果我们要执行复制操作,那么应该保留的数量。

2 个答案:

答案 0 :(得分:2)

首先,您必须了解,objectAobjectB 不是(Objective-C)对象。它们是对象的引用。 (对象具有保留计数,而不是对对象的引用。)

所以,你的情况是正确的:

  • objectA指向RC为1的对象。
  • objectB指向RC为0的对象。

第二句是矛盾:从来没有RC 0的对象,因为到达RC 0会释放对象。所以没有任何对象了。 (实际上永远不会达到RC为0,因为当RC将为0时,对象将被释放。但这是一个实现细节,因此并不重要。)

陈述......

objectB = [objectA retain];

...增加对象*的RC,objectA指向。 -retain的返回值是接收器指针(objectA)的值。然后将此引用分配给objectB。因此objectB - 仍然是引用 - 指向同一个对象,objectA指向。由于RCs由对象拥有,因此只有一个对象,只有一个RC。它是2.

备注*即使记录-retain增加RC,但并非总是这样。有一些具有永久谎言时间的物体,具有虚拟标记RC。但是,我会保持答案简单,因此我们假设-retain的每次执行都会增加RC。但试试这个:

    id ref = @"RC";
    NSLog(@"%lu", [ref retainCount]);
    [ref retain];
    NSLog(@"%lu", [ref retainCount]);

你得到:

2017-04-01 22:09:21.214 reftest[74967:8550738] 18446744073709551615
2017-04-01 22:09:21.215 reftest[74967:8550738] 18446744073709551615

有什么增加的?否。

但出于同样的原因,你绝不应该考虑RC的绝对值(“RC为1”),而是改变源代码中某个位置的值:保留后RC通常更大1 比以前。发布后,RC通常小于1 。计算一个绝对值你必须考虑对该对象的所有强引用,这是不可能的。它没有意义,因为它是RC的强项,你认为通过引用而不是所有引用一起引用。

答案 1 :(得分:0)

你的问题没有意义。

首先,关于变量名称的注释:您应该使用以小写字母开头的变量名称。

如果ObjectA中有一个对象,而ObjectB中有一个对象,并且ObjectB的保留计数中的对象达到零,则会立即释放该对象,并且不再存在。 ObjectB现在是一个“僵尸”(指向解除分配对象的指针)。 如果在保留计数达到零时尝试对ObjectB执行任何操作,则可能会崩溃,或者系统可能会在该内存中存储不同的对象,并且您的代码实际上可能指向完全错误的对象。

执行以下行时:

ObjectB = [ObjectA retain];

...然后变量ObjectB现在也指向ObjectA,并且你已经将ObjectA对象的保留计数增加到2.(ObjectB和ObjectA现在是同一个对象,保留计数为2.)< / p>