【问题标题】:Autorelease then retain for setters自动释放然后为设置器保留
【发布时间】:2011-01-22 13:02:31
【问题描述】:

根据Google Objective-C Style Guide,我们应该这样自动释放然后保留:

- (void)setFoo:(GMFoo *)aFoo {
  [foo_ autorelease];  // Won't dealloc if |foo_| == |aFoo|
  foo_ = [aFoo retain];
}

在这种情况下,如果将 foo_ 设置为同一个实例,则不会释放它,从而形成更具防御性的 setter。

我的问题是,@property 和 @synthesize 是这样工作的吗?

【问题讨论】:

    标签: objective-c properties autorelease


    【解决方案1】:

    直到当前运行循环结束时才会调用由于自动释放而导致的释放,因此 foo_ 不会释放,因为首先调用保留,然后在当前运行循环结束时释放。但是,这不是@synthesize 中生成的代码的工作方式。它更像是

    - (void)setFoo:(GMFoo *)aFoo {
       if (aFoo != foo_) {
          [aFoo retain];
          [foo_ release];
          foo_ = aFoo;
       } 
    }
    

    这种方法在不需要更改时节省了 cpu 周期,并消除了使用自动释放池的少量开销。

    【讨论】:

    • 如果是这样的话,那谷歌的推荐不是不太理想吗?
    • 是的。它看起来更吸引人,但不太理想。
    • 如果你不使用 [foo_ autorelease] 如果对象是非原子的并且它是从另一个线程访问的,你可能会遇到竞争条件。通过使用 [foo_ autorelease],我们通常只需要支付一点性能损失就可以安心了!因此谷歌的建议。
    • 您不能通过简单地执行[foo_ release]; foo_ = [aFoo retain]; 来简化if 语句的主体吗?
    猜你喜欢
    • 2011-07-18
    • 2011-09-06
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2011-08-28
    • 2011-09-19
    相关资源
    最近更新 更多