保留/释放保留财产的合成设定者

时间:2012-02-21 22:06:57

标签: objective-c memory-management properties

保留对象的setter是否会自动首先释放对象?

我还没有ARC工作,所以我有这些问题。

假设我有这样定义的ivar:

ObjectClass *anObject_;

有了原因

@property (nonatomic, retain) ObjectClass *anObject;

使用

进行综合
@synthesize anObject = anObject_;

如果我有一个使用retain属性自动合成的setter,那么setter是否会首先执行发布,如果需要就像这样:

- (void) setAnObject:(ObjectClass*)anObject {
    if (anObject_) [anObject_ release];
    anObject_ = [anObject retain];
}

并且可以在不首先释放对象的情况下简单地对对象进行分配

我可以通过将属性分配给nil 来释放对象吗?(如果有其他所有者,这可能是不安全的。)

self.anObject = nil;

换句话说,我可以免除设置者之外的if (anObject_) [anObject_ release];代码,让合成的setter为我做这个

如果我编写自己的setter,是否需要添加/包含retain 如果合成的setter包含发行版(这是我的初始问题),我是否需要添加/包含此,在我自己的二传手

最后一件事 - 当使用ARC时,我认为self.anObject = nil;self.anObject = anthingelse;都是安全的并且无论我的setter代码是什么,原始对象都会被释放的

1 个答案:

答案 0 :(得分:3)

几乎每一个问题的答案都是肯定的。保留和释放将添加到您的代码中以使其正确。具体来说,strong属性的setter将释放其当前值并保留其新值。即使您不使用合成访问器并编写自己的访问器,它们仍然会有正确的行为。事实上,在ARC下,您甚至不能在自己的代码中拨打retainrelease

您似乎有点困惑的一点是:

  

我可以通过将属性分配给nil来释放对象吗? (这个   如果有其他所有者可能不安全。)

确实,当您将属性设置为nil时,将在对象上调用release。但请记住,这并不一定意味着对象将被释放:只有在保留计数变为0时才会发生。

当我们说一个对象拥有另一个对象时,我们通常意味着该对象具有对另一个对象的强引用,因此在赋值时调用retain。只要该对象此时至少有一个其他所有者,将该属性设置为nil将不会导致它被取消分配。

如果你使用ARC,有一种更容易思考这一切的方法。忘记retainrelease,只考虑对象所有权。只要某个其他对象拥有该对象(带有strong引用),就不会释放该对象。真正唯一要记住的陷阱是周期:如果两个对象彼此拥有,那么它们就不能被解除分配。