嘿伙计们,假设以下代码:
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)合成属性。 只是想知道两件事:
谢谢!
答案 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
的文档:
重要:此方法通常是 调试内存没有价值 管理问题。因为任何数字 框架对象可能已保留 一个对象,以保持参考 在它同时,同时 自动释放池可能持有任何 一个延迟发布的数量 对象,你不太可能 可以从中获得有用的信息 方法