objective-c - 自动释放然后保留给 setter

标签 objective-c properties autorelease

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

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

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

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

最佳答案

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

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

此方法可以在不需要更改时节省 CPU 周期,并消除使用自动释放池的少量开销。

关于objective-c - 自动释放然后保留给 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4767939/

相关文章:

iphone - 核心数据插入错误

python - 在 Python 中模拟异步属性

macos - 10.7 上的 ARC 迁移工具给出错误 : it is not safe to remove an unused 'autorelease' message

cocoa - 在 NSOperation 中自动释放对象安全吗?

ios - 如何在 iOS 的 XMPP 框架中设置资源

ios - 关闭 UIViewController 时闪烁

objective-c - NSString 和 NSMutableString 连接

ios - 属性上的 Swift 扩展事件监听器

java - Spring 3.0 @Value 从属性文件读取部署时出现异常

iphone - 内存管理addSubview :