2

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

但是我想不出一个很好的论据来解释为什么你会关心你是否使用foo = self.bar, 或foo = bar.

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

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

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

4

2 回答 2

2

一个很好的理由是封装。当您通过访问器时,该类可以自由地在接口后面执行它想要的任何技巧(正如您在问题中已经说过的那样)。该值可能是延迟获取的,它可能是动态计算的,也可能是从其他对象中获取的。也就是说,在类实现中,我通常使用普通的 ivar 访问,因为如果属性实现发生更改,我可以自由地重写它。(当在公共标头中声明私有 ivars 时,这曾经是一个更大的问题,以便您的子类可以直接访问它们。)

至于线程,我认为默认的 getter/setter 组合是原子的,这意味着您不会得到一个错误,即 getter 将在 setter 中间被调用,从而获得一些无效值。我从来没有读过这个问题,查看nonatomic属性修饰符的文档。(或者这个相关的问题。)

于 2012-07-31T06:55:01.980 回答
1

getter 还需要符合@property语句中定义的内存管理规则;例如,如果它具有retain需要使用的属性autorelease

- (NSString *)name
{
    return [[_name retain ] autorelease];
}

并且将其合成可以使您不必输入它。另外,能够同时合成 getter 和 setter 是一个更完整的解决方案。

于 2012-07-31T06:46:55.210 回答