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

vds*_*dsf 2 memory-management 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

bbu*_*bum 5

为什么在使用Rectangle的原点的getter访问器时ref count会变为3?

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

难道我做错了什么 ?

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

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

如果引用计数为3,我不明白这段代码是如何泄漏的.在myRect上调用release将使它降至2,因为我在dealloc()中调用了origin的发布.但是,自动释放什么时候生效?

An autorelease只是一个延迟release,当包含池被drain编辑时就会启动.因此,在您的情况下,对象将在[pool drain];执行时被释放.