【问题标题】:Case for not using Properties in Objective-C在 Objective-C 中不使用属性的案例
【发布时间】:2012-12-10 13:08:52
【问题描述】:

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

“最佳实践是在您需要时随时在对象上使用属性 跟踪一个值或另一个对象。如果确实需要定义 您自己的实例变量无需声明属性,您可以添加 它们在类接口顶部的大括号内或 实施...”

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

谢谢!

【问题讨论】:

    标签: objective-c properties instance-variables


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-27
          • 2011-07-07
          • 1970-01-01
          • 2010-12-05
          • 2014-12-12
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          相关资源
          最近更新 更多