Objective-C @synthesize语法

Objective-C @synthesize syntax

本问题已经有最佳答案,请猛点这里访问。

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

1
@synthesize valueOne= _valueOne;

我注意到,有这样的语法就不可能以编程方式设置ValueOne的属性,例如,执行如下操作

1
valueOne.tag = 3

因此,出于我自己的目的,我已经超过了"=ValueOne"部分的评论,对代码的功能没有任何明显的损害。

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

提前谢谢


此语法是以_valueOne的名称合成valueOne的支持ivar。您可以简单地编写代码,使其看起来像

1
_valueOne.tag = 3;

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

1
self.valueOne.tag = 3;

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

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

这是一种常见的实践,现代clang的自动合成行为将使用ivars的前导下划线样式。这意味着,如果您完全删除@synthesize行,它的行为就好像您删除了@synthesize valueOne = _valueOne;