0

免责声明:我对 Objective-C 很陌生

我在一个命令行项目中 ARC 未启用

我有一个名为 MyClass 的课程

@interface MyClass : NSObject
@end

@implementation MyClass
@end

我的主要看起来像

int main(int argc, char *argv[])
{
    MyClass *first = [MyClass new];
    MyClass *second = first;
    return 0;
}

问题:

  1. 我知道*first的保留计数为 1。但我不明白为什么*second也保留计数 = 1?我没有对该对象执行新建、保留、分配或复制操作。

  2. 由于*first的保留计数为 1,我是否必须为此调用 release?正如您在代码中看到的,我必须释放对象,但性能分析器显示没有内存泄漏。为什么?

  3. 我注意到*first*second都具有相同的内存地址值。然后我认为*first保留计数应该在分配时增加到 2。但它没有,为什么?

  4. 我注意到,当我保留*first并将其分配给*second 时,它们的保留计数均为 2(见下文)

    int main(int argc, char *argv[])
    {
        MyClass *first = [MyClass new];
        [first retain];
        MyClass *second = first;
        return 0;
    }
    

    所以基本上*second成为*first的副本,在这种情况下它什么时候发布?

  5. 如果我将代码更改为,两个指针的保留计数会发生什么情况

    int main(int argc, char *argv[])
    {
        MyClass *first = [MyClass new];
        MyClass *second = first;
        [first retain];
        return 0;
    }
    

    我的意思是*second保留计数也会增加吗?

先感谢您。

4

1 回答 1

3
  1. 通过调用newalloc创建保留计数为 1 的对象是正确的。

  2. 分配secondfirst不会修改保留计数。Second 只是指向与 first 相同的对象的指针。保留计数是对象上的一个变量,因此所有指向同一对象的指针将始终显示相同的保留计数。

  3. 您必须使用类分配@property或手动调用-retain以增加保留计数。您现在所做的称为弱指针。second 到 first 的分配不会修改原始对象的保留计数。

  4. 是的,两个指针再次指向同一个对象。对对象的修改将反映在两个指针中。

  5. 两个指针都指向同一个对象,因此通过调用 [first retain] 将修改单个对象,并且指向它的所有指针都将显示保留计数的增加。

您需要将firstandsecond视为指针,而不是单个对象。该程序中只有一个对象,即创建于 的对象-new。通过在第一个或第二个指针上调用 release 或 retain ,您只是对两者指向的单个对象进行更改。

于 2013-01-30T15:15:17.523 回答