我在iOS和MRC的MRC中有一个查询我有点困惑。假设我有两个对象ObjectA&具有以下相同类型的ObjectB保留计数
现在我正在执行操作
ObjectB = [ObjectA retain];
任何人都可以告诉我什么会保留ObjectA&对象B?
据我所知,保留ObjectA = 2& ObjectB = 1。
如果我错了,请纠正。如果我们要执行复制操作,那么应该保留的数量。
答案 0 :(得分:2)
首先,您必须了解,objectA
和objectB
不是(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>