【问题标题】:"self" in objective C [duplicate]目标C中的“自我”
【发布时间】:2011-05-16 22:05:22
【问题描述】:

可能重复:
Should I Use self Keyword (Properties) In The Implementation?

假设我有一个类“Person”,它有一个实例变量“age”。来自 Python,在为 Person 类编写方法时,我习惯于使用“self.age”访问年龄,但是在 Objective C 中,我注意到在引用实例时,“self.age”和“age”都被接受变量(而在 Python 中只有前者可以工作)。

当没有明确指定您的意思是哪个实例的变量时,它是否默认为'self'?不明确指定自我是否被认为是不好的风格?如果没有,是否有关于何时使用 self.age 和何时使用 age 的约定?

【问题讨论】:

  • 已经在这里解释了stackoverflow.com/questions/1051543/…
  • Guido 喜欢“显式”引用成员变量,因此他决定应该将它们都写成 self.ivar Objective-C 为 ivars 和方法名称提供了单独的命名空间,并且有一个新的语法元素使用 " properties”,其中self.ivar 实际上是方法调用的糖。要在 ObjC 中对 ivar 进行简单访问,请编写裸 ivar 名称。除非您使用属性,否则点语法实际上是非法的,因为self 是指针,而 Obj-C 是 C,等等等等。 (请参阅 ughoavgfhw 的回答):) 请参阅 Henrik 找到的链接。

标签: objective-c self


【解决方案1】:

ageself.age 是两个完全不同的东西。在实例方法内部,对象的实例变量被隐式定义在作用域中,除非被局部变量遮蔽(参见The Objective-C Programming Language)。这就是age 正常工作的原因。使用点表示法时,您引用的是property,这意味着您实际上是在调用[self age],而不是直接访问实例变量。您还可以使用结构指针运算符 (->) 直接访问实例变量。这个很少用到,但是可以用来直接访问同一个类或者不同类的其他实例中的变量,也可以访问self。因此,ageself->age 完全一样的东西,但 self.age 完全不同。

【讨论】:

    【解决方案2】:

    使用self 使用访问器和修改器方法,而忽略它直接修改实例变量。为了使用self.age,您必须将age 声明为具有@property 语法的属性。我通常会尽可能使用self

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2015-01-01
      • 2017-05-30
      相关资源
      最近更新 更多