Apple的Memory Management Programming Guide显示了三种官方认可的技术,用于编写需要保留或释放对象引用的访问器方法。
在前两种技术的情况下(下面再现),Apple文档说“技术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.
}
这是技术1和技术2之间的唯一区别,还是使用一个而不是另一个具有我可能需要注意的其他微妙后果?如果技术2使用性能更好的getter,它是否遵循该技术1使用性能更好的setter,因为title
获得了明确的(并且可能是立即的)释放?
答案 0 :(得分:1)
2中的getter和1中的setter:
- (NSString*) title
{
return title;
}
- (void) setTitle: (NSString*) newTitle
{
if (title != newTitle)
{
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
答案 1 :(得分:0)
第二个吸气剂是脆弱的(如果有人访问对象的title
然后释放对象,它会崩溃),所以第一个吸气剂通常更好,即使速度稍慢。
第一个setter效率更高,即使在不存在自动释放池的情况下也能工作,所以最好。它更高效的原因不仅仅是因为自动释放与发布 - 如果你试图将属性设置为现有值,它根本不会做任何工作。