0

我知道这已经被回答过(有点),但我一直在阅读关于何时或何时不释放尚未通过分配专门子类化的对象的相互矛盾的答案。

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

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

或者一般来说,

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

综合后,如果我对 myObject 什么都不做(不分配甚至忘记使用它),在任何情况下我仍然负责释放它吗?

4

1 回答 1

3

根据您是否使用ARC,有两个完全不同的答案。由于 ARC 环境非常简单,我将仅从 pre-ARC 的角度回答。要理解的主要内容是,所有关于属性保留语义的讨论只是分散了主要观点:如果您拥有所有权,则必须放弃它。放弃所有权是通过-release. 因此,您需要了解的是“什么才算拥有所有权?”

按照惯例,每当您向包含任何 [ new, alloc, retain, copy] 的类发送消息时,您现在就拥有该对象。编译器根据您指定的所有权策略为 Objective C 属性生成 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有关访问器应该如何实际工作的研究,请参阅这篇文章

于 2012-06-19T15:40:59.247 回答