根据您是否使用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有关访问器应该如何实际工作的研究,请参阅这篇文章。