2010-06-17 47 views
2

嗨,假设下面的代码:Objective-C的引用计数和自动释放

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

矩形的起源被声明为(保留)合成属性。 只想知道2件事:

  1. 为什么在使用Rectangle原点的getter访问器时ref ref会变为3?难道我做错了什么 ?
  2. 由于引用计数为3,我不明白这段代码不能泄漏。由于我在dealloc()中调用了释放源,因此在myRect上调用释放会使其降至2。但是,autorelease何时生效?

谢谢!

回答

5

为什么使用 的getter访问器的 的ref计数变为3?Rectangle的原点?

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

我做错了什么?

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

任何对象的绝对保留计数是相当彻底无用的考虑。你只关心增量;如果导致保留计数增加,则必须使其减少。

以3引用计数,我不 了解这个代码片段 不能漏气。调用发布在myRect 将使它下降到2,因为我呼吁在dealloc()中的起源 版本。 不过呢,autorelease什么时候取 的效果呢?

一种autorelease是一个简单的延迟release该踢当含池是drain编辑。所以,在你的情况下,当执行[pool drain];时,该对象将被释放。

+0

好信息。不知道getter叫做retain/autorelease。 非常感谢! – vdsf 2010-06-17 04:33:09

+0

乐于帮助... – bbum 2010-06-17 04:41:25

2

从苹果公司的文件上-retainCount

重要:这种方法通常的 没有价值在调试内存 管理问题。由于框架对象的任何数量的 可能保留 对象,以保持引用 它,而在同一时间 自动释放池可持有 对象的任何 推迟发行的数量,这是非常不可能的,你 可以从这个 方法中获得有用的信息。