6

在使用 Objective-C 编程下的苹果 OS X 10.8 核心库文档中,它指出,

“最好的做法是在您需要跟踪一个值或另一个对象的任何时候对一个对象使用一个属性。如果您确实需要在不声明属性的情况下定义自己的实例变量,您可以将它们添加到顶部的大括号内类接口或实现......”

所以我很好奇,在哪些情况下需要定义实例变量而不声明属性?除了苹果所说的,它真的只是个人喜好吗?

谢谢!

4

3 回答 3

2

其中一些绝对是偏好问题,但并非全部:最好为具有外部可见性的项目以及需要在课堂内外进行不同访问控制的项目设置属性。自从引入 ARC 以来,这个问题就不那么明显了,因为在此之前,您可能希望使用属性来自动调用保留和释放。当您需要将对象自动复制到您的属性中时,这方面属性的重要性已大大降低。

于 2012-12-24T00:28:42.857 回答
1

如果您正在使用 ARC 和最近的运行时(最近足以让您在 @implementation 块中声明您的 ivars),那么实例变量又突然变得很棒了。为什么?因为与@properties 不同,它们是特定于类的。没有风险他们会意外地被子类覆盖。

在简单的情况下它们也更快,因为您不调用任何方法来获取或设置它们。

我个人也觉得它更干净。不再有定义私有@properties 的类扩展,以及所有这些垃圾。只是 ivars,又好又简单。

所以最好的建议,恕我直言,默认使用它们。仅在您确实需要它们的功能时才使用 @properties,例如:

  • 您需要一种从课堂外访问它们的方法。
  • 您希望允许子类覆盖它们。
  • 您的 getter 或 setter 不仅仅是一项琐碎的任务。

后两者实际上都比您想象的要少。尝试覆盖子类中的属性通常是不明智的,因为它有点不寻常并且有一些粗糙的边缘。

如果您稍后确实发现需要将 ivar 升级为 @property,这很简单 - 唯一可以访问它的位置是在您的 @implementation 中,因此通常只需简单的搜索和替换即可添加“自己。” 到它的引用(如果你这样命名它们,可能会删除前导下划线)。'在此之前,您无需支付费用并承担使用@properties 的风险。

于 2012-12-24T02:12:45.627 回答
0

我更喜欢属性,因为我能够定义 setter/getter,而且我更喜欢这种语法。
许多人肯定使用 ivars 是一种不好的做法,就像在这篇文章中一样:
http
://cocoasamurai.blogspot.it/2012/08/cover-up-those-ivars.html 不幸的是,现在程序员把他们所做的一切都称为不好的做法不喜欢,即使没有客观原因。
如果你声明一个 ivar,你仍然可以使用 @private 指令,所以不是公开或不公开变量的问题。我认为如果你喜欢更多 ivar,你应该使用它们。

于 2012-12-24T00:34:24.227 回答