【问题标题】:Objective-C Properties in iPhone DevelopmentiPhone 开发中的 Objective-C 属性
【发布时间】:2010-11-08 22:58:44
【问题描述】:

Objective-C 中的属性和实例变量有什么区别。我需要用 OOP 术语来理解这一点。属性声明是否只是用于访问实例变量的便利包装器(在实现中使用 @synthesize)?

谢谢,

codecowboy。

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:

    PropertyInstance ivar的区别在于,可以在另一个类中可见的属性,而要访问 iVar 或实例,您需要创建该类的对象,然后才能访问。 并且使用 @synthesize 编译器将为该属性生成 setter 和 getter。

    -(TYPE)name;-getter 方法

    -(void)setName:(TYPE)aName;设置方法

    【讨论】:

      【解决方案2】:

      properties 和 ivars 是两个完全不同的东西。

      而实例变量是存储在对象内部的变量,所以每个实例都有自己的。它通过相对于对象指针/自身的指针添加来引用(对于现代运行时略微间接,但在功能上等效)。 ivars 通常在类内部,默认情况下只能由类及其后代 (@protected) 访问。在方法中,它们可以不加限制地使用,否则它们可以(但很少,通常不应该)通过间接访问,例如 obj->ivar。

      一个属性定义了一个getter和setter(setter是可选的)接口。这就是它所做的一切。它定义了两个公共方法:

      - (TYPE) propname;
      - (void) setPropname: (TYPE) newPropname;
      

      这些被定义为方法,就好像你这样声明它们,不多也不少。这些方法要么使用普通语法([obj propname] 和 [obj setPropname:n] 要么使用现代点符号(obj.propname 或 obj.propname = n)调用。这两个选项仅在语法上不同,它们的行为相同,并且无论方法是使用@property 声明还是如上所述手动声明,您都可以使用点符号。

      然后你必须在实现中实现方法,要么自己编写方法,要么使用@synthesize,要么动态处理缺失的方法。

      属性可能由 ivar 支持(命名相同或命名不同(我倾向于避免混淆)),也可能不支持。他们可能将其价值存储在其他地方,或者他们可能从其他数据中计算出来。

      例如,您可能有:

      @property (nonatomic, readonly) NSString* fullname;
      

      然后实现 - (NSString*) fullname 以返回名和姓的串联。

      【讨论】:

      • 这正是我困惑的地方。对象实例不也拥有自己的属性吗?我对对象的一般理解是它们包含有关状态(数据)和行为(方法)的信息。为什么我需要实例变量和属性?除非我将它们声明为属性,否则实例变量是否不可变?
      • 属性是外部对象获取和设置数据的接口。实例变量是该对象的内部变量,尽管它可以使用属性、它自己的 getter/setter 方法或间接通过您创建的其他公共方法暴露给外部对象。
      • 换句话说,属性语句不会在实例对象中创建任何东西。它只是告诉外界如何从对象中获取某些东西。这可能是一个实例变量,或者可能是您想要为其编写 getter 和 setter 方法的任何信息。至于实例变量,可以像在 C 和 C++ 中一样访问它们。
      【解决方案3】:

      我认为你几乎在那里。 @property 和 @synthesize 为已声明的 ivar 进行访问器声明和实现。您还可以在 @property 上定义各种属性,让您可以控制它的生成方式以使其适合 ivar

      看看"Objective C 2.0 Declared Properties"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2020-08-16
        • 1970-01-01
        • 2011-06-10
        相关资源
        最近更新 更多