3

我已阅读“Xcode 中的新功能”,但我找不到此功能的官方解释。我在哪里可以找到官方的解释?哪个文档?谢谢。

4

4 回答 4

14

假设您的意思是它会为您自动生成 ivar 以及 getter 和 setter 方法,即使您省略@synthesize: 这也称为默认属性合成、自动属性合成和属性自动合成。

没有很多文档。据我所知,没有关于它如何工作的官方文档,只是它存在的事实。

这确实是一个 clang 功能,而不是 Xcode 功能。它在 Xcode 4.0 DP 4 附带的 clang 版本中短暂出现,但不久后由于错误而被删除。它重新出现在 Xcode 4.4 附带的 clang 版本中。 我认为这是添加它的提交。

您可以在Objective-C 功能可用性索引中找到它。

Clang Language Extensions中也提到了它。

从实验:

  • 如果您没有显式地@synthesize生成一个属性并且它生成一个实例变量,它将自动生成一个与声明的属性具有相同类型(并且在 ARC 下,所有权资格)的 ivar。ivar 名称将是一个下划线 ( _),后跟声明的属性名称。

  • 如果你没有显式地定义@synthesize一个readonly属性,并且你确实包含了一个显式的 getter 方法,那么 clang 将不会自动为你生成一个 ivar。

  • 如果你没有显式地定义@synthesize一个readwrite属性,并且你确实包含一个显式的 getter 和一个显式的 setter,那么 clang 也不会自动为你生成一个 ivar。

但我不知道这些行为的任何官方文档。

于 2012-08-25T05:13:34.863 回答
8

您可以在 Apple 文档中的Objective-C 编程语言: “Property Implementation Directives”下的 Declared Properties 中找到它。是否自动合成 ivar 取决于您使用的运行时:

存取器综合的行为因运行时而异(另请参阅“运行时差异”):

  • 对于旧版运行时,实例变量必须已经在当前类的 @interface 块中声明。如果存在与属性同名的实例变量,并且它的类型与属性的类型兼容,则使用它——否则,会出现编译器错误。
  • 对于现代运行时(参见 Objective-C 运行时编程指南中的“运行时版本和平台”),实例变量是根据需要合成的。如果同名的实例变量已经存在,则使用它。

iOS 始终使用现代运行时,因此您无需显式声明 ivars。

于 2012-08-25T05:18:24.877 回答
2

实际上,这是编译器的一部分。

您可以在LLVM 规范网站中阅读。

于 2012-08-25T05:00:37.083 回答
1

我还要提请您注意Cocoa 编码指南,该指南建议:

  • 避免显式声明公共实例变量。

    开发人员应该关注对象的接口,而不是它如何存储数据的细节。您可以通过使用已声明的属性并合成相应的实例变量来避免显式声明实例变量。

于 2012-08-25T05:12:54.250 回答