你如何判断你是否需要释放一个对象?

问题描述:

你能描述返回已分配给调用者(且来电者应该释放)的对象,并返回一个自动释放对象的方法等的命名约定区别?你如何判断你是否需要释放一个对象?

如果您声明具有retain属性的属性,是否需要在将属性设置为nil之前释放该属性?

@synthesize指令是做什么的?

+0

你应该一般不会问一个三个问题。 “@综合”问题与其他两个无关。每个问题应该是一个问题,以便其他用户可以搜索他们的问题,并找到他们的问题,而不必通过与其无关的其他问题。 – 2010-10-15 21:25:59

Aaron在下面列出了内存分配的一个很好的来源。

关于@synthesize

假设你有一个属性P,你必须做的是写一个getter和为它的制定者。有一些常见的方法,其中之一是当您设置该属性并释放旧值时保留该对象。 E.G:

- (void)setP:(PClass *)value 
{ 
    [value retain]; 
    [_pInstanceVariable release]; 
    _pInstanceVariable = value; 
} 

由于这是一个代码很常见的一块,编译器可以为您自动执行它,如果你指定的属性声明retain关键字,然后在你的实现做@synthesize。编译器将生成上面提到的代码,这意味着您的代码将更加清洁,而且不会有繁琐的重复部分。

同样适用于干将真实的,除非你想要的东西复杂得多:

- (PClass *)p 
{ 
    return _pInstanceVariable; 
} 

@synthesize将做的工作

+2

这里的setter实现在技术上是不正确的。在释放实例变量之前,您始终需要保留传递给setter方法的值。如果你不这样做,如果传入的对象与已存储在变量中的对象相同,则你的应用程序将崩溃。 – johnw188 2010-10-15 19:07:16

+0

你是对的约翰!感谢您的更正 – Nick 2010-10-18 18:10:50

apple documentation

你只释放或自动释放对象你自己。 如果使用名称以“黄金”或“新”,或包含“复制”(例如,分配,NEWOBJECT,或mutableCopy),或者如果你向它发送一个retain消息的方法创建你需要一个对象的所有权。

您使用release或autorelease放弃对象的所有权。 autorelease的意思是“将来发送一条发布消息”(了解何时会发布,参见“Autorelease Pools”)。

你的第二个问题是相关的。 @synthesize所做的就是为您的实现文件生成其他方法。 @property的参数(nonatomic,retain)NSString * myString;定义生成的方法的行为。例如,如果您将属性声明为retain,则setMyString生成的方法将保留其参数。

非原子很重要,因为默认情况下,属性是线程安全的。如果您不需要线程安全性,则可以删除存取方法中的大量开销。

最后,保留产权的实现

- (void) setMyString:(NSString*)newString { 
    [newString retain]; 
    [myString release]; 
    myString = newString; 
} 

所以,说self.myString =无有效释放MyString的为您服务。许多人主张使用self.property = nil来保留属性,而不是[property release],尽管我认为这只是个人偏好。