我读过“Xcode中的新功能”,但我找不到此功能的官方解释。 我在哪里可以找到官方解释?哪个文件?感谢。
答案 0 :(得分:14)
假设你的意思是它为你自动生成一个ivar和getter以及setter方法,即使你省略了@synthesize
:这被称为默认属性合成,自动属性合成和属性自动合成。
没有很多文档。据我所知,有没有官方文档说明它是如何工作的,只是它存在的事实。
这是一个铿锵的功能,而不是Xcode功能。它出现在Xcode 4.0 DP 4附带的版本clang中,但由于错误后不久被删除。它再次出现在Xcode 4.4附带的clang版本中。我认为,Here's the commit添加了它。
您可以在Objective-C Feature Availability Index中找到它。
Clang Language Extensions中也提到了它。
来自实验:
如果您没有明确@synthesize
一个属性并且它生成一个实例变量,它将自动生成一个与声明的属性具有相同类型(并且在ARC下,所有权限定)的ivar。 ivar名称将是下划线(_
),后跟声明的属性名称。
如果您不明确地@synthesize
readonly
属性,并且您执行包含一个明确的getter方法,那么就铿锵将不自动为您生成一个ivar。
如果您不明确@synthesize
readwrite
属性,并且执行包含两者一个明确的getter和一个明确的setter,然后clang将不自动为你生成一个ivar。
但我不知道这些行为的任何官方文件。
答案 1 :(得分:8)
您可以在“属性实施指令”下的Objective-C Programming Language: Declared Properties中的Apple文档中找到此信息。是否自动合成ivar取决于您使用的运行时间:
访问者合成的行为有所不同,这取决于运行时(另请参阅“运行时差异”):
- 对于遗留运行时,实例变量必须已在当前类的@interface块中声明。如果存在与该属性同名的实例变量,并且其类型与属性的类型兼容,则使用它 - 否则,您将收到编译器错误。
- 对于现代运行时(请参阅Objective-C运行时编程指南中的“运行时版本和平台”),可根据需要合成实例变量。如果已存在同名的实例变量,则使用它。
iOS总是使用现代运行时,因此您永远不需要明确声明ivars。
答案 2 :(得分:2)
实际上,这是编译器的一部分。
您可以在LLVM
specification website。
答案 3 :(得分:1)
我还会提请你注意Coding Guidelines for Cocoa建议:
避免明确声明公共实例变量。
开发人员应关注对象的界面,而不是关于如何存储数据的详细信息。您可以通过使用声明的属性并合成相应的实例变量来避免显式声明实例变量。