为什么要通过@synthesized setter(而不是直接访问ivar),保留/复制内存管理或KVO,有很多内容。
但是,如果您使用foo = self.bar
或foo = bar
,我无法想出您关心的原因。
我唯一能想到的是数据抽象......如果bar是声明的属性,那么底层实现可能会发生变化而其他任何人都不会关心。 (当然,在这种情况下,你可能不会使用@synthesized getter)
那么......使用@synthesized getter的任何令人信服的理由?是否有一些线程问题使其变得重要?
就此而言,除了返回ivar之外,@synthesized代码甚至做了什么?
答案 0 :(得分:2)
一个很好的理由是封装。当你通过访问器时,该类可以自由地在界面后面做任何想要的技巧(正如你在你的问题中已经说过的那样)。该值可以懒惰地获取,可以在运行中计算或从其他对象获取。也就是说,在类实现中我通常使用普通的ivar访问,因为如果属性实现发生变化,我可以自由地重写它。 (当在公共标题中声明私有ivars时,这曾经是一个更大的问题,因此您的子类可以直接访问它们。)
至于线程,我认为默认的getter / setter组合是原子的,这意味着你不能得到一个错误,它会在setter的中间调用getter,得到一些无效的值。我从来没有读过这个问题,请查看nonatomic
属性修饰符的文档。 (或this related question。)
答案 1 :(得分:1)
getter还需要符合@property
语句中定义的内存管理规则;例如,如果它具有retain
属性,则需要使用autorelease
:
- (NSString *)name
{
return [[_name retain ] autorelease];
}
合成它可以让你不必输入它。另外,能够合成getter和setter是一个更完整的解决方案。