为啥属性不会自动合成

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 开始,这就是现在发生的情况。不再明确要求合成。

【讨论】:

以上是关于为啥属性不会自动合成的主要内容,如果未能解决你的问题,请参考以下文章

自动属性合成 (@property) 和继承

XCode 6.3警告:合成属性

@property 的本质是什么?

数据隐藏和 Objective-C 合成器 [重复]

合成存储方法,局部/全局变量

通过扩展自动合成 Swift 结构或枚举的 Equatable 一致性