你如何判断你是否需要释放一个对象?
你能描述返回已分配给调用者(且来电者应该释放)的对象,并返回一个自动释放对象的方法等的命名约定区别?你如何判断你是否需要释放一个对象?
如果您声明具有retain属性的属性,是否需要在将属性设置为nil之前释放该属性?
@synthesize指令是做什么的?
Aaron在下面列出了内存分配的一个很好的来源。
关于@synthesize
:
假设你有一个属性P
,你必须做的是写一个getter和为它的制定者。有一些常见的方法,其中之一是当您设置该属性并释放旧值时保留该对象。 E.G:
- (void)setP:(PClass *)value
{
[value retain];
[_pInstanceVariable release];
_pInstanceVariable = value;
}
由于这是一个代码很常见的一块,编译器可以为您自动执行它,如果你指定的属性声明retain
关键字,然后在你的实现做@synthesize
。编译器将生成上面提到的代码,这意味着您的代码将更加清洁,而且不会有繁琐的重复部分。
同样适用于干将真实的,除非你想要的东西复杂得多:
- (PClass *)p
{
return _pInstanceVariable;
}
的@synthesize
将做的工作
内存分配信息和命名可以在这里找到
合成这里
苹果网站记录有出色的文档,我建议首先寻找在那里。
你只释放或自动释放对象你自己。 如果使用名称以“黄金”或“新”,或包含“复制”(例如,分配,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],尽管我认为这只是个人偏好。
你应该一般不会问一个三个问题。 “@综合”问题与其他两个无关。每个问题应该是一个问题,以便其他用户可以搜索他们的问题,并找到他们的问题,而不必通过与其无关的其他问题。 – 2010-10-15 21:25:59