Objective c 使用@synthetic getter有什么意义?

Objective c 使用@synthetic getter有什么意义?,objective-c,Objective C,关于为什么要使用@synthetic setter(而不是直接访问ivar)、保留/复制内存管理或KVO,有很多问题 但是我想不出一个好的理由来解释为什么你会在意你是否使用了foo=self.bar,或者foo=bar 我唯一能想到的是数据抽象……如果bar是一个声明的属性,那么底层的实现可能会改变,没有人会在意。(当然,在这种情况下,您可能不会使用@synthetic getter) 那么…有什么令人信服的理由使用@synthetic getter吗?是否存在一些线程问题使其变得重要 就这点而

关于为什么要使用@synthetic setter(而不是直接访问ivar)、保留/复制内存管理或KVO,有很多问题

但是我想不出一个好的理由来解释为什么你会在意你是否使用了
foo=self.bar
,或者
foo=bar

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

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


就这点而言,@synthesized code除了返回ivar之外还能做什么?

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

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

而且,把它合成可以省去你打字的麻烦。另外,能够综合getter和setter是一个更完整的解决方案。

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


<> p>至于线程,我认为默认的吸收器/设置器组合是原子的,这意味着你不能得到一个bug,在那里,吸收器将被调用在设置器的中间,得到一些无效的值。我从来没有读过很多关于这个问题的文章,请查看
非原子属性修饰符的文档。(或.

这是
[[u name retain]autorelease]
@hamstergene谢谢-还是在我的第一杯咖啡上-请注意:如果使用ARC编译,“内存管理规则”参数不适用
foo=bar
将始终“做正确的事情”。@MartinR这是真的,但是OP不会告诉use他使用的是MRR还是ARC。我通常使用MRR。我仍然会继续生成合成的getter(和setter),但是对于原始数据类型,如果直接访问ivar,特别是从类自己的方法中访问ivar,这有关系吗?不过,您的延迟加载示例需要自定义getter…而不是@synthedrated。我当然认为需要定制getter。线程安全点是一个很好的点。关键是如果您现在不使用合成getter,而是使用直接ivar访问,那么您以后就不能在不重写对ivar的所有访问的情况下更改实现(例如,通过添加延迟加载)。如果直接ivar访问泄露给您的子类甚至API用户,这可能是一个问题。