【问题标题】:Objective-C ref count and autoreleaseObjective-C 引用计数和自动释放
【发布时间】:2010-06-17 04:18:25
【问题描述】:

大家好,假设下面的代码:

int main (int argc, const char * argv[]) 
{
//[...]
    Rectangle* myRect  = [[Rectangle alloc] init];

    Vector2* newOrigin = [[[Vector2 alloc] init] autorelease]; // ref count 1

    [newOrigin setX: 50.0f];
    [myRect setOrigin: newOrigin];    // ref count 2

    [myRect.origin setXY: 25.0f :100.0f]; // ref count goes to 3... why ?

    [myRect release];

    [pool drain];
    return 0;
}

矩形的原点被声明为(保留)合成属性。 只是想知道两件事:

  1. 为什么在使用 Rectangle 源的 getter 访问器时引用计数变为 3?我做错了什么吗?
  2. 引用计数为 3,我不明白这段代码的 sn-p 是如何不能泄漏的。因为我在 dealloc() 中调用源上的释放,所以在 myRect 上调用 release 会使其下降到 2。但是,autorelease什么时候生效呢?

谢谢!

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    为什么引用计数变为 3 时 使用 getter 访问器 长方形的起源?

    因为您的@property 被声明为atomic(默认值),因此合成的getter 保留然后自动释放返回值。

    我做错了吗?

    是的。您正在研究绝对保留计数。

    考虑任何对象的绝对保留计数是完全没有用的。你只关心增量;如果您使保留计数增加,则必须使其减少。

    引用计数为 3,我没有 了解这个 sn-p 的代码是如何 不能泄漏。在 myRect 上调用 release 自从我打电话后,它会降到 2 在 dealloc() 中释放原点。 但是,什么时候自动释放需要 效果?

    autorelease 只是一个延迟的release,它在包含池为drained 时启动。因此,在您的情况下,当执行 [pool drain]; 时,该对象将被释放。

    【讨论】:

    • 好消息。不知道称为保留/自动释放的吸气剂。非常感谢!
    【解决方案2】:

    来自 Apple 在-retainCount 上的文档:

    重要提示:这种方法通常是 调试内存没有价值 管理问题。因为任何数 的框架对象可能已保留 一个对象以保存引用 对它,同时 自动释放池可能持有任何 延迟发布的数量 反对,你不太可能 可以从中得到有用的信息 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2012-01-11
      相关资源
      最近更新 更多