在 Objective-C 类中使用self.var
vs.有什么区别?var
对其中一个或另一个有好处或危险吗?
3 回答
self.var
为调用属性var
。在幕后,Objective-C 会自动为属性生成一个 getter(或者您可以自己制作一个,如果愿意的话),因此self.var
使用该 getter。Plainvar
直接访问实例变量(即,它不通过 getter 来获取值)。
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 通知。
Duplicate of
- How does dot syntax work without explicit @property in Objective-C?
- self.variable and variable difference
- What's the difference between using obj-c accessors and using dot syntax?
- iVars, With and Without self?
- Is "self" necessary?
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.