这里有几个方面需要考虑,其中一些已经提到过。
首先,下划线只是一个合法字符和名称的一部分。_foo
本地 iVar对应于 property或多或少只是一个约定foo
。总是这样
- 你让它们自动合成。(无
@synthesize
声明)然后自动生成 iVar,并带有前导下划线。(在较新版本的 Objective C 中)
- 您有意声明 iVar并以它在命名时
_foo
引用的方式扩展 @synthesize 语句。您也可以声明属性和 ivar并将它们链接到自定义 getter 或自定义 getter 中。这与任何约定相去甚远,因此通常不推荐。例子:_foo
foo
foo
bar
@synthezise
@synthesize foo = _foo;
- 您提供自定义 getter 和 setter 并访问该属性。同样,您可以将任何 iVar 与该属性链接,甚至可以设置其中的一些以响应输入等。pp。
属性 foo 对应于 ivar foo 时
- 您使用
@synthezise
时不提供 ivar 的名称。只是@synthesize foo
;(我认为,取决于 ojective-c 的版本,无论是否使用 ivar foo 的 explizit 声明都可以使用,但我不会用血签名)
一般来说,我建议坚持使用下划线模式,尽管我自己并不总是这样做。优点是 ivar 和属性之间的分离对程序员来说更明显,这有助于避免错误。特别是同名的本地参数(很常见)不会隐藏 ivar。示例foo
:
foo = @1; //This refers to the iVar foo.
self.foo = @1; //This calls the setter.
[self setFoo:@1]; //This calls the setter.
someVar = [self foo]; // This calls the getter.
foo = foo; // This would not work assuming that foo is a local parameter of the method.
self->foo = foo // This is not good style but a workaround for the line above in that situation. This accesses the ivar directly on the left side of the equation, not its setter.
self.foo = foo; // This is fine when foo is the local parameter.
_foo 也一样,对程序员来说更清楚:
_foo = @1; //This refers to the iVar _foo.
self.foo = @1; //This calls the setter.
[self setFoo:@1]; //This calls the setter.
someVar = [self foo]; // This calls the getter.
_foo = foo; // This would work nicely assuming that foo is a local parameter of the method.
self->_foo = foo // No need for doing that. It is rather C style anyway and not that common in Obj-C.
self.foo = foo; // This, too, is fine when foo is the local parameter. Clearly uses the setter.