为什么不自动合成属性

时间:2010-11-01 12:16:52

标签: objective-c properties

也许这是一个愚蠢的问题。我每次制作@property时都必须@synthesize。但是,使用@property(whatever) Type* property可以做的唯一事情就是在实现文件中执行@synthesize property。为什么两者都需要?为什么编译器不能自动生成getter / setter方法而不必编写@synthesize property

5 个答案:

答案 0 :(得分:14)

在当前的生产编译器中,默认值 - 没有@synthesize的情况 - 是什么都不做,然后警告是否未提供实现。

在最新版本的LLVM 2.0编译器中,

@synthesize是自动的。

自己实施setter / getter时,

@dynamic 不是必需的。在运行时动态提供实现时使用@dynamic。也就是说,如果您未提供@dynamic foo;@property <type> foo;实施,则-foo-setFoo:结合将导致编译器不发出警告。 / p>

请注意,您还可以使用@synthesize propertyName = instanceVariableName;将特定的,名称不同的实例变量用作后备存储。

接口中的

@property非常适合getter / setter方法声明。它还携带更多元数据(保留,赋值等),编译器在@synthesize期间利用这些元数据。

而且,与往常一样,atomic属性对线程安全没有任何帮助。

答案 1 :(得分:2)

历史上,目前的编译器需要这样做。在XCode 4中,不再需要@synthesize(根据WWDC视频,希望我不违反NDA)......

答案 2 :(得分:1)

@synthesize不是唯一的选择。 @dynamic property也是可能的。

答案 3 :(得分:0)

@synthesize不是唯一的选择;还有@dynamic,这意味着你将自己实现这些方法。 [删除;有关详细信息,请参阅bbum的答案。]

答案 4 :(得分:0)

从Xcode 4.4开始,现在发生了这种情况。不再明确要求合成。