是什么意思使用@synthesized getter?

时间:2012-07-31 06:41:14

标签: objective-c

为什么要通过@synthesized setter(而不是直接访问ivar),保留/复制内存管理或KVO,有很多内容。

但是,如果您使用foo = self.barfoo = bar,我无法想出您关心的原因。

我唯一能想到的是数据抽象......如果bar是声明的属性,那么底层实现可能会发生变化而其他任何人都不会关心。 (当然,在这种情况下,你可能不会使用@synthesized getter)

那么......使用@synthesized getter的任何令人信服的理由?是否有一些线程问题使其变得重要?

就此而言,除了返回ivar之外,@synthesized代码甚至做了什么?

2 个答案:

答案 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是一个更完整的解决方案。