7

在 Objective-C 类中使用self.varvs.有什么区别?var对其中一个或另一个有好处或危险吗?

4

3 回答 3

6

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

于 2011-01-07T16:24:10.773 回答
5
foo = self.var;
self.var = foo;

在概念上等同于

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

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

foo = var;
var = foo;

在概念上与

foo = self->var;
self->var = foo;

因此,不使用点表示法访问实例变量与将 self 视为指向 C 结构的指针并直接访问结构字段相同。

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

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

于 2011-01-07T16:46:06.133 回答
0

Duplicate of

and probably about a dozen others that you could've found in about 15 seconds by using the "Search" box up in the top right corner of the site.

于 2011-01-07T17:33:36.973 回答