Objective c 关于何时释放对象的更明确答案

Objective c 关于何时释放对象的更明确答案,objective-c,Objective C,我知道这个问题以前已经得到了回答(有点),但我一直在阅读关于何时或何时不释放一个没有通过分配专门子类化的对象的相互矛盾的答案 例如,如果我执行以下操作: @property (..., retain) NSMutableArray *myArray; 或者一般来说 @property (some retain attribute - strong, weak, retain) type myObject; 在合成之后,如果我对myObject不做任何其他操作(没有分配,甚至忘记使用它),是否

我知道这个问题以前已经得到了回答(有点),但我一直在阅读关于何时或何时不释放一个没有通过分配专门子类化的对象的相互矛盾的答案

例如,如果我执行以下操作:

@property (..., retain) NSMutableArray *myArray;
或者一般来说

@property (some retain attribute - strong, weak, retain) type myObject;

在合成之后,如果我对myObject不做任何其他操作(没有分配,甚至忘记使用它),是否有任何情况下我仍然负责释放它?

根据您是否使用ARC,有两个完全不同的答案。因为ARC环境非常简单,所以我将从ARC前的角度进行回答。需要理解的主要问题是,所有围绕property retain语义的讨论都只是从要点上转移注意力:如果你拥有所有权,你必须放弃它。通过
-release
放弃所有权。所以,你需要了解的是“什么才算拥有所有权?”

按照惯例,每当您向包含[
new
alloc
retain
copy
]中任何一个的类发送消息时,您现在拥有该对象。编译器根据您指定的所有权策略为目标C属性生成setter方法。例如

@property (..., retain) NSMutableArray *myArray;
@synthesize myArray = _myArray;
这将生成一个如下所示的方法1:

现在,当你说类似于
self.myArray=someArray
的话时,你就知道你已经向
someArray
发送了一条retain消息,你要负责以后发布它。理想的方法是说
self.myArray=nil
,因为它会在保留
nil
之前释放旧值。请注意,发送该消息也是非常安全的,即使您从未将任何内容设置为
myArray
属性,因为将消息发送到
nil
也可以。这就是为什么在处理完所有属性后,不管它们是如何使用的,通常都会将它们设置为
nil



1有关访问器实际工作方式的研究,请参见。

根据您是否使用ARC,有两个完全不同的答案。因为ARC环境非常简单,所以我将从ARC前的角度进行回答。需要理解的主要问题是,所有围绕property retain语义的讨论都只是从要点上转移注意力:如果你拥有所有权,你必须放弃它。通过
-release
放弃所有权。所以,你需要了解的是“什么才算拥有所有权?”

按照惯例,每当您向包含[
new
alloc
retain
copy
]中任何一个的类发送消息时,您现在拥有该对象。编译器根据您指定的所有权策略为目标C属性生成setter方法。例如

@property (..., retain) NSMutableArray *myArray;
@synthesize myArray = _myArray;
这将生成一个如下所示的方法1:

现在,当你说类似于
self.myArray=someArray
的话时,你就知道你已经向
someArray
发送了一条retain消息,你要负责以后发布它。理想的方法是说
self.myArray=nil
,因为它会在保留
nil
之前释放旧值。请注意,发送该消息也是非常安全的,即使您从未将任何内容设置为
myArray
属性,因为将消息发送到
nil
也可以。这就是为什么在处理完所有属性后,不管它们是如何使用的,通常都会将它们设置为
nil



1有关访问器应如何实际工作的研究,请参阅。

啊,谢谢!是的,我的意思是没有弧。虽然,从我所读到的,即使设置了ARC,也有一些情况,但您仍然要对发布负责。但除此之外,由于我在某些情况下不确定(比如简单地用对象填充保留的NSMutable数组,而从不直接分配它们),因此我一直将其设置为nil,由于不确定,我也发布了它们资金计时器1小时前啊,谢谢你!是的,我的意思是没有弧。虽然,从我所读到的,即使设置了ARC,也有一些情况,但您仍然要对发布负责。但除此之外,由于我在某些情况下不确定(比如简单地用对象填充保留的NSMutable数组,而从不直接分配它们),因此我一直将其设置为nil,由于不确定,我也发布了它们一小时前