4

Apple 的内存管理编程指南展示了三种官方认可的技术,用于编写需要保留或释放对象引用的访问器方法。

在前两种技术的情况下(转载如下),Apple 文档说“在 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.
}

这是技术 1 和技术 2 之间的唯一区别,还是使用其中一种方法会产生我可能需要注意的其他微妙后果?如果技术 2 使用性能更好的 getter,它是否遵循技术 1 使用性能更好的 setter,因为它title获得了显式(并且可能是立即)发布?

4

2 回答 2

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.
    }
}
于 2011-01-10T00:15:54.040 回答
0

The second getter is fragile (it will crash if somebody access's the object's title and then releases the object), so the first is generally preferable even if marginally slower.

The first setter is more efficient and will work even in situations where an autorelease pool doesn't exist, so it's preferable. The reason it's more efficient is not just because of autorelease vs. release — it doesn't do any work at all if you try to set the property to its existing value.

于 2011-01-08T22:30:29.163 回答