【问题标题】:Which of these memory management techniques is better in what situations?这些内存管理技术在什么情况下更好?
【发布时间】:2011-01-08 22:17:24
【问题描述】:

Apple 的 Memory Management Programming Guide 展示了三种官方认可的技术,用于编写需要保留或释放对象引用的访问器方法。

在前两种技术的情况下(转载如下),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 获得了显式(并且可能是立即)释放?

【问题讨论】:

    标签: objective-c memory-management accessor


    【解决方案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.
        }
    }
    

    【讨论】:

      【解决方案2】:

      第二个 getter 很脆弱(如果有人访问对象的 title 然后释放该对象,它会崩溃),所以第一个通常更可取,即使稍微慢一些。

      第一个 setter 效率更高,即使在不存在自动释放池的情况下也能正常工作,因此更可取。它更高效的原因不仅仅是因为 autorelease 与 release - 如果您尝试将属性设置为其现有值,它根本不会做任何工作。

      【讨论】:

      • 如果dealloc方法通过访问器正确清除变量,那么第二种技术不会导致崩溃,因为标题将被自动释放,并且当新标题不同时,第二个setter更快。不过,它确实使用了更多内存,因为旧标题不会立即释放。
      • @ughoavgfhw:在 dealloc 中使用访问器是不合适的,事实上,Apple 和大多数 Cocoa 程序员都认为这是一种不好的做法,我听说过关于此事的评论。
      • @chuck 从技术 1 访问 getter 然后释放也会导致崩溃。
      • @Remover:这到底为什么会导致崩溃?
      • @chuck 因为在自动释放之后,保留计数应该与技术 2 相同。所以释放也可能导致崩溃,不是吗?但是现在考虑一下……如果对象在获取之前已经保留,则两者都不应该有任何问题。如果我错了,请纠正我...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2014-01-22
      相关资源
      最近更新 更多