根据Google Objective-C Style Guide,我们应该自动释放然后保留:
- (void)setFoo:(GMFoo *)aFoo {
[foo_ autorelease]; // Won't dealloc if |foo_| == |aFoo|
foo_ = [aFoo retain];
}
在这种情况下,如果将foo_设置为相同的实例,则不会释放foo_,从而成为更具防御性的setter。
我的问题是,这是@property& @synthesize工作?
答案 0 :(得分:4)
在当前runloop结束时才被调用,所以foo_不会dealloc,因为先调用retain,然后在当前runloop结束时释放。但是,这不是@synthesize中生成的代码的工作原理。它更像是
- (void)setFoo:(GMFoo *)aFoo {
if (aFoo != foo_) {
[aFoo retain];
[foo_ release];
foo_ = aFoo;
}
}
此方法在不需要更改时节省了cpu周期,并且消除了使用自动释放池的小开销。