Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 保留/释放保留属性的合成Setter_Objective C_Memory Management_Properties - Fatal编程技术网

Objective c 保留/释放保留属性的合成Setter

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

保留对象的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];
}
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;