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

时间:2012-06-19 15:12:48

标签: objective-c

我知道这已经得到了回答(但有点)但是我一直在阅读有关何时或何时不释放未通过分配明确分类的对象的相互矛盾的答案。

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

@property (..., retain) NSMutableArray *myArray;

或一般来说,

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

合成后,如果我对myObject不做任何其他事情(没有分配甚至忘记使用它),是否有任何情况我还有责任释放它?

1 个答案:

答案 0 :(得分:3)

根据您是否使用ARC,有两种完全不同的答案。由于ARC环境非常简单,我只是从ARC之前的角度回答。要理解的主要内容是,所有围绕属性保持语义的讨论只会分散注意力:如果你拥有所有权,你必须放弃它。放弃所有权是通过-release完成的。那么,你需要了解的是"什么算作取得所有权?"

按照惯例,每当您向包含[newallocretaincopy]的任何内容发送邮件时,您现在都拥有该对象。编译器根据您指定的所有权策略为Objective C Properties生成setter方法。例如......

@property (..., retain) NSMutableArray *myArray;
@synthesize myArray = _myArray;

这将生成一个类似于 1 的方法:

- (void)setMyArray:(NSMutableArray *)myArray
{
    // This is oversimplified, just to illustrate the important point.
    // Again, this is NOT the way a setter would actually be synthesized.
    [_myArray release];
    _myArray = [myArray retain];
}

现在,当您说self.myArray = someArray之类的内容时,您知道您已向someArray发送了保留消息,并且您将负责稍后发布该消息。这样做的理想方法是说self.myArray = nil,因为它会在保留nil之前释放旧值。请注意,即使您从未向myArray属性设置任何内容,发送该消息也非常安全,因为向nil发送消息是可以的。这就是为什么始终在您使用它们时将所有属性设置为nil的常见原因,无论它们如何被使用。

<小时/>

1 有关访问者实际应如何工作的研究,请参阅this article