为啥属性不会自动合成
Posted
技术标签:
【中文标题】为啥属性不会自动合成【英文标题】:Why don't properties get automatically synthesized为什么属性不会自动合成 【发布时间】:2011-05-03 09:32:20 【问题描述】:也许这是一个愚蠢的问题。每次我制作 @property
时,我都必须 @synthesize
它。但这没有任何意义,你可以用@property(whatever) Type* property
做的唯一事情就是在实现文件中做@synthesize property
。那么为什么两者都需要呢?为什么编译器不自动生成 getter/setter 方法而无需我编写 @synthesize property
。
【问题讨论】:
【参考方案1】:这只是历史上的,因此当前的编译器需要这样做。在 XCode 4 中,这些 @synthesize 将不再需要(根据 WWDC 视频,希望我不会在这里违反 NDA)...
【讨论】:
【参考方案2】:@synthesize
不是唯一的选择。 @dynamic property
也是可以的。
【讨论】:
谢谢我不知道动态。 你也可以自己实现getter/setter。【参考方案3】:@synthesize 不是唯一的选择;还有@dynamic,这意味着您将自己实现这些方法。 [已编辑;请参阅 bbum 的答案以了解更多详细信息。]
【讨论】:
进一步讨论差异:***.com/questions/1160498/… 谢谢。不过,这对我来说仍然很奇怪。如果我自己实现 getter 和 setter,我可以将函数定义复制到头文件中,而无需使用 @property 声明。 :) 这个答案通常是正确的,但有一些细节是错误的。看我的回答。 如果添加@dynamic,最好不要收到编译器警告!这就是重点! (检查)事实上,您不会收到编译器警告。当然,如果你不动态注入一个实现,你会得到一个运行时异常。 @bbum 我不知道我在写那条(现已删除)评论时在想什么。【参考方案4】:在当前的生产编译器中,默认情况(没有@synthesize
的情况)是什么都不做,然后在未提供实现时发出警告。
@synthesize
在最新版本的 LLVM 2.0 编译器中是自动的。
@dynamic
在自己实现 setter/getter 时不需要。 @dynamic
在运行时动态提供实现时使用。也就是说,如果您不提供 -foo
和 -setFoo:
实现,@dynamic foo;
结合 @property <type> foo;
将导致编译器不发出警告。
请注意,您还可以使用 @synthesize propertyName = instanceVariableName;
将特定的、不同名称的实例变量用作后备存储。
接口中的@property
是getter/setter 方法声明的简写。它还携带更多元数据(保留、分配等),编译器在@synthesize
期间利用这些元数据。
和往常一样,atomic
属性对线程安全并没有真正的帮助。
【讨论】:
【参考方案5】:从 Xcode 4.4 开始,这就是现在发生的情况。不再明确要求合成。
【讨论】:
以上是关于为啥属性不会自动合成的主要内容,如果未能解决你的问题,请参考以下文章