根据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/