【问题标题】:Difference between self.var and simply varself.var 和简单 var 之间的区别
【发布时间】:2011-01-07 16:21:38
【问题描述】:

在 Objective-C 类中使用 self.var 与仅使用 var 有什么区别?对其中一个有好处还是有危险?

【问题讨论】:

标签: objective-c cocoa-touch cocoa instance-variables declared-property


【解决方案1】:

self.var 调用var属性。在幕后,Objective-C 会自动为属性生成一个 getter(或者您可以自己制作一个,如果愿意的话),所以 self.var 使用该 getter。 Plain var 直接访问实例变量(即不通过 getter 获取值)。

【讨论】:

  • 遍历生成的getter有什么好处?
  • @MyNameIsEarl:您的 getter 可以想象以某种方式修改 ivar(如果您编写自己的 getter,甚至为不存在的属性提供 ivar)。通过 getter 也会触发 KVO 通知,而直接访问 ivar 则不会。
【解决方案2】:
foo = self.var;
self.var = foo;

在概念上等同于

foo = [self var];
[self setVar: foo];

所以使用点表示法,您实际上是在向自己发送消息。

foo = var;
var = foo;

在概念上与

相同
foo = self->var;
self->var = foo;

所以不使用点符号来访问实例变量与将 self 视为指向 C 结构的指针并直接访问结构字段是一样的。

在几乎所有情况下,最好使用属性(点表示法或消息发送表示法)。这是因为可以使该属性自动执行必要的保留/复制/释放以阻止内存泄漏。此外,您可以将key value observing 与属性一起使用。子类也可以覆盖属性以提供自己的实现。

使用属性的两个例外是在 init 中设置 ivar 和在 dealloc 中释放它时。这是因为您几乎肯定希望避免在这些方法中意外使用子类覆盖,并且您不想触发任何 KVO 通知。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多