哪种内存管理技术在哪些情况下更好?

时间:2011-01-08 22:17:25

标签: objective-c memory-management accessor

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获得了明确的(并且可能是立即的)释放?

2 个答案:

答案 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效率更高,即使在不存在自动释放池的情况下也能工作,所以最好。它更高效的原因不仅仅是因为自动释放与发布 - 如果你试图将属性设置为现有值,它根本不会做任何工作。