-1

作为 iOS 应用程序编程的新手,我发现从一些示例代码开始非常有用。因此,我最终得到了一个 .m 文件,它以一些看起来像的行开头

@synthesize valueOne= _valueOne;

我注意到拥有这样的语法使得无法以编程方式设置 valueOne 的属性,例如执行类似的操作

valueOne.tag = 3

因此,出于我自己的目的,我对“=_valueOne”部分进行了注释,而对代码的功能没有任何明显的损害。

这种语法的意义是什么,我的示例代码的作者使用它的考虑是什么?

提前致谢

4

1 回答 1

3

valueOne此语法在 name 下合成支持 ivar _valueOne。您可以简单地编写代码看起来像

_valueOne.tag = 3;

也就是说,通常认为尽可能使用属性访问器会更好,因此您通常会将其写为

self.valueOne.tag = 3;

值得注意的例外是当您在-init,-dealloc或您自己的自定义 getter/setter 中时,您仍想直接使用 ivar。


在 ivar 名称上使用前缀下划线通常被认为是一种好的做法,因为这意味着如果您编写valueOne.tag = 3;并且打算使用该属性,则会收到编译器错误,而不是静默使用 ivar。如果您打算使用 ivar,则只需使用下划线前缀,如_valueOne.tag = 3;.

这是一种常见的做法,以至于现代 clang 的自动合成行为将使用前导下划线样式用于 ivars。这意味着如果您@synthesize完全删除该行,它的行为就像您拥有@synthesize valueOne = _valueOne;.

于 2013-03-01T20:50:19.037 回答