Objective-C @synthesize syntax
作为对iOS应用程序编程的新手,我发现从一些示例代码开始非常有用。因此,我最终得到了一个.m文件,它从一些看起来像
1
| @synthesize valueOne= _valueOne; |
我注意到,有这样的语法就不可能以编程方式设置ValueOne的属性,例如,执行如下操作
因此,出于我自己的目的,我已经超过了"=ValueOne"部分的评论,对代码的功能没有任何明显的损害。
这种语法的意义是什么?我的示例代码的作者考虑过如何使用它?
提前谢谢
- 另外还有16个:stackoverflow.com/q/5582448 stackoverflow.com/q/6049269 stackoverflow.com/q/2371489 stackoverflow.com/q/7174277 stackoverflow.com/q/5659156 stackoverflow.com/q/837559 stackoverflow.com/q/6146244 stackoverflow.com/q/10651535 stackoverflow.com/q/6124109 stackoverflow.com/q/8145373 stackoverflow.com/q/3521254 stackoverflow.com/Q/6064283 stackoverflow.com/Q/9696359 stackoverflow.com/Q/5521499 stackoverflow.com/Q/5466496 stackoverflow.com/Q/2114587
- 我真的第一次尝试寻找答案。问题是,用谷歌的方式来表达这一点有点困难…
- 不,不是:stackoverflow.com/search?Q=OBJECTIVE-C+下划线+综合事实上,在你发布这篇文章之前,这些问题中的一些会在建议中出现。
- @sjakelien在键入问题时,会向您显示可能相关问题的列表。许多与你的问题一起出现的问题,回答你的问题。
- 谢谢,我现在看到它们列在右边。我会更加注意的。
此语法是以_valueOne的名称合成valueOne的支持ivar。您可以简单地编写代码,使其看起来像
也就是说,通常认为尽可能使用属性访问器更好,因此通常将其编写为
值得注意的例外是,当您在-init、-dealloc或您自己的自定义getter/setter时,您仍然希望直接使用ivar。
在ivar名称上使用带前缀的下划线通常被认为是一种良好的做法,因为这意味着如果编写valueOne.tag = 3;并且打算使用该属性,则会得到一个编译器错误,而不是静默使用ivar。如果您打算使用ivar,只需使用下划线前缀,如_valueOne.tag = 3;。
这是一种常见的实践,现代clang的自动合成行为将使用ivars的前导下划线样式。这意味着,如果您完全删除@synthesize行,它的行为就好像您删除了@synthesize valueOne = _valueOne;。