【问题标题】:What are the reference counts of objects A and B after assigning B=A?赋值 B=A 后对象 A 和 B 的引用计数是多少?
【发布时间】:2025-12-27 01:15:11
【问题描述】:

在这段代码中分配B=AAB的引用计数是多少?

Class1 *A=[[Class1 alloc] init];
Class1 *B=[[Class1 alloc] init];

[A retain];
NSMutableArray *tempArray= [NSMutableArray alloc]init];
[tempArray addobject:A];
B=A;

【问题讨论】:

  • 第 5 步是什么意思?你能说得具体点吗?
  • 嗨,现在我让它更具体
  • 你也可以改一下标题吗?
  • 你的引用计数是多少?
  • 为什么有automatic-ref-counting 标签?如果你可以说retain,那么你没有使用自动引用计数。

标签: objective-c reference-counting retaincount


【解决方案1】:

取决于您是否使用 ARC,但由于您的代码中有 retain,我假设您不使用 ARC。

Class1 *A=[[Class1 alloc] init];

答:1

Class1 *B=[[Class1 alloc] init];

A:1, B:1

[A retain];

A:2, B:1

NSMutableArray *tempArray= [NSMutableArray alloc]init];

A:2, B:1

[tempArray addobject:A];

A:3, B:1

更新

B=A;

A:3, B:3 BUT原来的 B 仍然存在 B':1

【讨论】:

  • 在分配 B 、 B=2 和 A=0 后如何,因为行为与弱相同
  • 我不太明白你的问题,但我说的是创建的“原始”对象。当然,当您分配 B=A 时,A 的保留计数器与 B 相同,但原始 B 的保留计数仍为 1!
【解决方案2】:

这个问题似乎是由于在 objects 和指向这些对象的 pointers 之间缺乏区别。在您的代码运行之后,AB 指向的对象具有相同的引用计数值,因为它们是同一个对象。赋值操作不会改变对象的计数,指针也没有保留计数。只有对象可以。

人们经常谈论对象,就好像它们与它们的指针一样——“将对象A 传递给方法”——因为a)在大多数情况下没有相关的区别,b)它们只能是通过指针访问。这是存在相关差异的时期之一。

(赋值后B原来指向的对象已经泄露:它有一个正的retain count但是没有指向它的指针。)

【讨论】:

    最近更新 更多