【问题标题】:Why is everything a property in iOS SDK tutorials?为什么 iOS SDK 教程中的一切都是属性?
【发布时间】:2011-05-18 01:47:35
【问题描述】:

在我从 Apple 和其他地方在线阅读的大多数 iOS SDK 教程中,很多实例变量都被设为属性,即使它们只能从它们自己的类中访问。

例如在 Facebook 最新的 iOS SDK 中,鼓励用户在应用程序委托中维护名为 facebook 的 Facebook 类实例。 facebook" 是一个属性。然后在整个示例代码中将其称为“self.facebook”。但是“facebook”属性没有从应用程序委托之外的任何地方引用。

这是为什么?我错过了什么?如果实例变量仅在其自己的类中使用,我倾向于将其设为属性以使其不公开可见,并将其简称为 facebook 而不是 @987654324 @ 或 self->facebook 来自班级。

坦率地说,即使我需要 facebook 属性,我想我也更愿意在应用程序委托中将其简称为“facebook”而不是“self.facebook”。

那是什么?为什么我到处都能看到属性?

【问题讨论】:

    标签: iphone ios scope instance-variables private-members


    【解决方案1】:

    为什么应该使用属性(如 TechZen 所述,您可以将属性设为私有)的一个很好的例子是在 viewDidLoad 中创建新实例。

    人们一直都在这样做,因为每个视图控制器实例都会调用一次。或者,您认为...实际上,由于应用程序收到内存警告时发生的情况,每个实例可能会多次调用 viewDidLoad 类。

    因此,例如,您可能会编写如下代码:

    - (void) viewDidLoad
    { myArray = [[NSMutableArray alloc] init]; }
    

    效果很好 - 直到它再次被调用,然后你就有了泄漏。您可以在分配之前释放 myArray 以防万一 - 但问题是,这是一个容易忘记的步骤。

    如果您为每个实例变量使用属性,那么您的代码如下所示:

    - (void) viewDidLoad
    { self.myArray = [NSMutableArray array]; }
    

    现在你不会弄错的。如果多次调用 viewDidLoad ,旧数组将被释放,新数组将替换它的位置,而不会泄漏旧数组。

    【讨论】:

      【解决方案2】:

      属性与 iVar 是否公开无关。相反,属性创建了管理保留和促进封装的访问器方法。

      如果您想要私有属性,只需在 @private 指令下声明 ivar,然后在实现文件中定义属性。

      【讨论】:

      • 这是要走的路——使用属性很好,但不要暴露你不想在类外使用的属性也很好。我还要强调您的评论,即属性有助于管理留存率。
      • 很好,虽然我的问题并不清楚,但这是我一直在寻找的答案。我看到了使用属性的价值,但是想到它们可能会被不必要地公开暴露确实对我来说根本坐不住。@private 就是答案。
      【解决方案3】:

      属性可以生成 getter 和 setter。特别是 Setter,可以帮助(半)自动管理对象的保留/释放计数,从而减少某些类型的潜在内存错误。

      非对象的 Getter 和属性主要用于编码风格的正交性,尽管它们确实有可能在将来的代码扩展或重用中用于 mutator、键值通知等。

      可能存在一些效率差异/缺点,但这取决于所使用的特定 ObjC 运行时。

      【讨论】:

      • +1 属性也是使用 Key-Value Observing 所必需的。接口文件 (.h) 中公开的公共属性告诉其他对象如何调用这些属性。
      【解决方案4】:

      通常最好通过访问器访问实例变量,而不是直接访问。属性创建这些访问器,并提供诸如适当的键值更改通知和原子访问之类的东西。

      【讨论】:

        【解决方案5】:

        如果你引用facebook,那么它将直接访问变量,如果你访问self.facebook,那么它将通过setter/getter方法。

        结果是如果你需要改变一个对象或者在稍后的某个时间点,你需要在改变值的过程中做其他事情(即装箱)然后你可以把它放在 setter 方法中并减少不得不到处做。这是一件好事。

        【讨论】:

          【解决方案6】:

          它会自动为您创建 getter/setter。 另外,这里有一篇很好的帖子来解释它properties

          【讨论】:

            猜你喜欢
            • 2010-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-23
            • 2013-03-17
            • 2010-11-02
            相关资源
            最近更新 更多