【问题标题】:Objective-C retain count on assigning object to new pointerObjective-C 在将对象分配给新指针时保留计数
【发布时间】:2013-01-14 10:43:50
【问题描述】:

免责声明:我对 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 on 那?正如您在代码中看到的,我必须释放对象,但性能分析器显示没有内存泄漏。为什么?

  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 保留计数也会增加吗?

提前谢谢你。

【问题讨论】:

  • 请注意,在推理内存管理时,绝对保留计数是无用的。考虑增量。 Www.whentouseretaincount.com 有(狡猾的)详细信息。
  • @bbum 但在学习和调试时理解它们仍然是必不可少的。
  • 是的,@justinmeiners,必须了解绝对保留计数是无用的以及为什么(包括对调试无用)。因为它在实际代码中从未发生过的人为示例之外毫无用处。

标签: objective-c pointers memory-leaks retaincount


【解决方案1】:
  1. 您是正确的,调用newalloc 创建了一个保留计数为1 的对象。

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

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

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

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

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

【讨论】:

  • 感谢您的回答。我必须在第一个和第二个都调用 release 吗?我这里是否有内存泄漏,因为性能分析器显示没有泄漏。
  • 您只需要为每个保留调用 1 个版本。在这两个代码示例中,您创建对象 RC=1,然后保留它。 RC=2。这是一个泄漏。您可以调用 release 两次以获得 RC=0,也可以删除保留,因此 RC=1 并调用 release 一次以获得 RC=0。在这种情况下,您对第一个对象还是第二个对象调用 retain 和 release 都没有关系,因为它们指向同一事物,消息是同义词。
  • 不要假设 +new 和 +alloc 返回一个 RC 为 1 的对象;他们返回 RC +1 的对象。始终以增量来考虑保留计数。
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多