我已经搜索了许多有关ObjC访问器和合成访问器的问题.这个问题更多是一个“帮我解决问题”的问题;我不希望有一个答案,但我宁愿找专家来衡量这个论点.
在Cocoa Touch类中,我将编写一些这样的代码(其中soundEffects是一个合成的NSArray属性):
id foo = [self.soundEffects objectAtIndex:1];
一位同事问我要解释为什么上面比这条线更好:
id foo = [soundEffects objectAtIndex:1];
那么在功能上,这没有什么不同.
我对前者的论点如下:
> self.soundEffects告诉每个其他编码器工作的代码,这是一个iVar,而不是一个局部范围的变量.
>如果我们需要,我们可以在soundEffects getter访问器中放置自定义逻辑.
>没有具体的理由,它在“Obj-C”工作一年后就像在正确的事情上一样.
他接受参数#1和#2为有效,但也给出了对应点:
>这不是只是代码膨胀吗?
>不应该允许一个类直接与自己的iVar交谈,而不用自己调用一个方法(getter)呢?
任何人
解决方法
你的观点1是不正确的:self.soundEffects不是一个ivar,尽管它可能会发生给你一些东西 – 就像你在合成NSArray的情况一样.
这反过来又意味着你的观点2是这个问题的关键 – 如果你通过访问器路由所有访问,那么一切都很好地被封装,你可以随时修改实现,而不用担心副作用.
当您使用mutator时也是一个好习惯,因此您可以保持一致的内存管理.
在大多数情况下,我会说,通过self.property路由通过属性的所有东西,并限制直接ivar访问严格内部的东西.不过,我承认在某些情况下 – 特别是对于不使用保留/复制语义的东西,它可能更多的是一种风格偏好.