在iOS上的Objective-C中,使用合成的getter时,“self.foo”和“foo”之间的(风格)区别是什么?

我已经搜索了许多有关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访问严格内部的东西.不过,我承认在某些情况下 – 特别是对于不使用保留/复制语义的东西,它可能更多的是一种风格偏好.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...