2

如果我有这样的功能

void setSomeObject( SomeObjectClass obj /*, and some other params*/ )
{
  [_previous autorelease];
  _previous = obj;
}

据我了解,自动释放消息被发送到对象本身(而不是_previous),所以在某一时刻,当 setSomeObject 超出范围时,原始对象会被自动释放(如果有的话)。它是否正确?我没有使用属性,但我想通过使用它们,当我执行self.previous = obj;时,前一个对象的释放将是自动的。?

4

2 回答 2

1

当你向-autorelease一个对象发送消息时,它会被添加到 activeNSAutoreleasePool中,当 run loop 运行时它会被清空。如果你说[_previous autorelease],只有那个对象会被自动释放,如果你说_previous = obj,那只会改变变量的引用。旧对象仍然是自动释放的。

如果您在 setter 方法中执行此操作,则模式通常是这样的:

- (void)setSomeObject:(MyObjClass *obj) {
    if (obj != someObject) {
        [someObject release];
        someObject = [obj retain]; // or copy, depending on what you want
    }
}
于 2010-06-29T01:27:00.580 回答
0

不,这是不正确的。

[_previous autorelease] 将自动释放消息发送到 _previous。这就是这个语法的含义。

于 2010-06-29T01:26:49.020 回答