2010-06-29 46 views
2

如果我有这样自动释放以前的对象由分配

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

函数据我理解它的自动释放消息被发送到对象本身(未_previous) 所以在一个点上,有时当setSomeObject超出范围的原始对象是autoreleased(如果有)。它是否正确?我不使用属性,但我想通过使用它们释放的前一个对象将是自动的,当我做self.previous = obj;

回答

1

当您发送-autorelease消息给对象时,它将被添加到活动的NSAutoreleasePool,当运行循环运行时该消息被清空。如果你说[_previous autorelease],那么只有该对象会被自动释放,如果你说_previous = obj,那只会改变变量的引用。旧对象仍然是自动释放的。

如果你在setter方法这样做,这是个什么模式一般为:

- (void)setSomeObject:(MyObjClass *obj) { 
    if (obj != someObject) { 
     [someObject release]; 
     someObject = [obj retain]; // or copy, depending on what you want 
    } 
} 
+0

所以人们也可以写[_previous自动释放]但是它不是标准的感觉? (尽管需要确保它还没有指向相同的对象) – BuggerMe 2010-06-29 01:36:10

+0

是的。如果你记得基本的内存管理规则,你拥有所有权的任何对象(由alloc/new/copy/retain获得)必须稍后放弃(release或autorelease),所以任何一个都可以工作。但在这种情况下,不需要autorelease,因为您不需要在函数的其余部分引用该对象。 避免所有这些的另一种方法是使用@synthesize常规@property(copy)或(retain),它为您创建访问器方法,而不是执行我在我的答案中编写的所有内容,您只需执行' self.someObject = obj'。 – jtbandes 2010-06-29 02:09:06

0

没有那是不正确的。

[_previous autorelease]将autorelease消息发送到_previous。这是这个语法的含义。