为什么Apple的实例变量被认为是不好的做法?

Col*_*inE 13 cocoa objective-c instance-variables ios

在Apple的Objective-C编程中,关于封装数据的部分指出:

您可以定义没有属性的实例变量

最好在需要跟踪值或其他对象时在对象上使用属性.

换句话说,他们强烈建议您使用私有属性而不是实例变量用于任何私有对象状态.

我想知道为什么会这样呢?我知道属性具有KVO和属性(强,弱......)等功能,但在很多情况下我不需要这些功能,实例变量也可以正常工作.

实例变量可能不被视为最佳实践有什么好的理由吗?

ily*_* n. 3

尽管现在您的私有变量可能作为普通变量工作,但您稍后可能会决定某些属性“好东西”是有用的:

  • 观察
  • 原子访问器
  • 自定义访问器
  • 登录访问
  • 从子类访问

如果您仅将变量作为属性访问,则不会增加太多开销(除了在紧密的循环中),并且为获得上述任何好处留下了空间。

基本上,即使您不打算公开属性,属性也是有用的。

当然,有些地方使用实例变量仍然“更自然”,例如,如果您在类簇中重新实现基础类(例如NSArray),则预计您的实现是私有的且高性能的,因此我不使用那么属性。

另外,我认为你不应该过多地阅读这些建议。对我来说,它读起来更像是“如果您 5 分钟前才了解属性和实例变量,那么让我们先从使用属性开始”

刚接触这门语言的人可能会在不知道实例变量是什么的情况下走得很远。

  • @ColinE,您的方法的问题在于很难审核代码是否正确使用。您必须查看每个 ivar 访问并询问“我应该在这里使用访问器吗?” 这会导致错误并且难以维护代码。一致性使得审计变得容易,而直接使用 ivar 则使得一致性变得不可能。由于在很多情况下必须使用属性,因此最好始终使用属性。这是Apple 的观点,也是ObjC 的最佳实践。 (2认同)