Objective c 保留/释放保留属性的合成Setter
保留对象的setter是否首先自动释放该对象 我仍然在没有ARC的情况下工作,因此我有这些问题 假设我有这样定义的ivar:Objective c 保留/释放保留属性的合成Setter,objective-c,memory-management,properties,Objective C,Memory Management,Properties,保留对象的setter是否首先自动释放该对象 我仍然在没有ARC的情况下工作,因此我有这些问题 假设我有这样定义的ivar: ObjectClass *anObject_; 有条不紊 @property (nonatomic, retain) ObjectClass *anObject; 利用 @synthesize anObject = anObject_; 如果我有一个使用retain属性自动合成的setter,如果需要,setter会首先执行发布吗 - (void) setAnObj
ObjectClass *anObject_;
有条不紊
@property (nonatomic, retain) ObjectClass *anObject;
利用
@synthesize anObject = anObject_;
如果我有一个使用retain属性自动合成的setter,如果需要,setter会首先执行发布吗
- (void) setAnObject:(ObjectClass*)anObject {
if (anObject_) [anObject_ release];
anObject_ = [anObject retain];
}
a是否可以在不首先释放对象的情况下对其进行赋值?
我是否可以通过将属性指定为nil来释放对象?(如果有其他所有者,这可能不安全。)
换句话说,我是否可以省去if(anObject_uu)[anObject_uu发布]代码>在setter外部编码,并让合成setter为我执行此操作?
如果我编写自己的setter,我是否需要添加/包括retain?如果合成setter包含发布(这是我的第一个问题),我是否需要在我自己的setter中添加/包括它?
最后一件事——使用ARC时,我假设self.anObject=nil代码>和self.anObject=anthingelse代码>都是安全的?并且无论我的setter代码是什么,原始对象都将被释放?您的每个问题的答案几乎都是肯定的。保留和发布将添加到代码中以使其正确。具体来说,strong
属性的setter将释放其当前值并保留其新值。即使不使用合成的访问器并编写自己的访问器,它们仍然具有正确的行为。事实上,在ARC下,您甚至不允许在自己的代码中调用retain
或release
您似乎有点困惑的一点是:
我可以通过将属性指定为nil来释放对象吗?(本
如果有其他所有者,则可能不安全。)
确实,当您将属性设置为nil时,将对对象调用release
。但请记住,这并不一定意味着对象将被解除分配:只有当retain计数变为0时才会发生这种情况
当我们说一个对象拥有另一个对象时,我们通常是指该对象对另一个对象具有强引用,因此在赋值时调用retain
。只要对象此时至少有一个其他所有者,将属性设置为nil
不会导致解除分配
如果使用ARC,有一种更简单的方式来考虑所有这些。忘记保留
和发布
,只考虑对象所有权。只要某个对象拥有它(使用strong
引用),该对象就不会被解除分配。实际上,唯一需要记住的陷阱是循环:如果两个对象彼此拥有,那么它们就不能被释放。如果我理解正确,那么我可以将保留的属性值设置为nil(或任何其他值),这将始终首先释放,即使我编写了明确包含if的setter,这也是正确的(anObject_uject)[anObject_uu释放];
代码。您能确认吗?如果您编写了一个setter,然后将其属性设置为nil
,那么将对旧对象值调用release
,即使您没有在编写的setter中调用release
。实际上,您不允许在setter中调用release
(或其他任何地方)当您使用ARC时。
self.anObject = nil;