苹果公司的内存管理编程指南展示了三种官方认可的编写需要保留或释放对象引用的访问器方法的技术。
在前两种技术的情况下(如下所述),苹果文档称:“在 getter 方法被调用次数远多于 setter 方法的情况下,技术2的性能明显优于技术1。”
// Technique 1
- (NSString*) title
{
return [[title retain] autorelease];
}
- (void) setTitle: (NSString*) newTitle
{
if (title != newTitle)
{
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
// Technique 2
- (NSString*) title
{
return title;
}
- (void) setTitle: (NSString*) newTitle
{
[title autorelease];
title = [newTitle retain]; // Or copy, depending on your needs.
}
这两种技术的唯一区别是什么?如果使用其中一种而不是另一种,是否还有其他微妙的后果需要我注意?如果技术2使用更好的getter,那么技术1是否使用更好的setter,因为
title
会得到明确(并且可能是立即的)释放?
Foo *foo = [Foo new]; NSString *name = [foo name]; [foo release]; return [name stringByAppendingString:@" is my name"];
—— 使用getter 2会崩溃,但使用getter 1完全正常。 - Chuck