Objective-C引用计数和自动释放

时间:2010-06-17 04:18:26

标签: objective-c memory-management

嘿伙计们,假设以下代码:

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;
}

将Rectangle的原点声明为(retain)合成属性。 只是想知道两件事:

  1. 当使用Rectangle的getter访问器时,为什么ref count变为3?我做错了吗?
  2. 如果引用计数为3,我不明白这段代码是如何泄漏的。在myRect上调用release将使它降至2,因为我在dealloc()中调用了origin的发布。但是,自动释放什么时候生效?
  3. 谢谢!

2 个答案:

答案 0 :(得分:5)

  

为什么ref count在3时变为3   使用的getter访问器   Rectangle的起源?

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

  

我做错了吗?

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

任何对象的绝对保留计数都非常无用。你只关心三角洲;如果导致保留计数增加,则必须使其减少。

  

参考次数为3,我没有   了解这段代码如何   不能泄漏。在myRect上调用release   因为我打电话会让它降到2   在dealloc()中发布原点。   但是,自动释放什么时候开始   实现

autorelease只是一个延迟release,当包含池drain时,它会启动。因此,在您的情况下,执行[pool drain];时将取消分配对象。

答案 1 :(得分:2)

来自Apple关于-retainCount的文档:

  

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