Why don't properties get automatically synthesized
也许这是个愚蠢的问题。每次我做一个@property,我都要做一个@synthesize。但这毫无意义,您对@property(whatever) Type* property唯一能做的就是在实现文件中执行@synthesize property。为什么两者都需要?为什么编译器不自动生成getter/setter方法而不需要我编写@synthesize property。
在当前的生产编译器中,缺省情况(没有@synthesize的情况)是什么都不做,然后在没有提供实现时发出警告。
在最新版本的llvm 2.0编译器中,@synthesize是自动的。
自己实现setter/getter时不需要@dynamic。在运行时动态提供实现时使用@dynamic。也就是说,如果不提供-foo和-setFoo:实现,@dynamic foo;与@property foo;组合将导致编译器不发出警告。
请注意,您也可以使用@synthesize propertyName = instanceVariableName;将特定的、不同名称的实例变量用作后备存储。
接口中的@property非常适合getter/setter方法声明。它还包含更多的元数据(保留、分配等),编译器在@synthesize期间使用这些元数据。
和往常一样,atomic属性对线程安全没有真正的帮助。
它只是历史上的,所以当前的编译器需要这样做。在Xcode4中,不再需要那些@synthesis(根据WWDC视频,希望我不会违反这里的NDA)。
不是唯一的选择。也可以使用@dynamic property。
- 谢谢,我不知道动态。
- 您还可以自己实现getter/setter。
从xcode 4.4开始,这就是现在发生的事情。合成不再是明确要求的。
@合成不是唯一的选择;还有@dynamic,这意味着您将自己实现这些方法。[修订;请参阅bbum的答案了解更多详细信息。]
- 关于差异的进一步讨论:stackoverflow.com/questions/1160498/…
- 谢谢。不过,我还是觉得很奇怪。如果我自己实现getter和setter,我就可以不使用@property声明将函数定义复制到头文件中。:)
- 这个答案通常是正确的,但有很多细节是错误的。看看我的答案。
- 如果添加@dynamic,最好不要收到编译器警告!这就是重点!(正在检查)实际上,您不会收到编译器警告。当然,如果不动态地注入一个实现,您将得到一个运行时异常。
- @我不知道我写那条评论时在想什么。
- 不用担心——这似乎是一个非常常见的困惑点。我很好奇它是从哪里来的。