我们为什么必须使用@synthesize?

时间:2012-07-24 15:25:19

标签: objective-c

所以我在头文件中使用@property键。

如果我这样做,我应该在我的实现中使用@synthesize密钥,对吧?但我想知道,是否有一个真正的原因我必须这样做?我只是想知道为什么不在标题中写@property就足以让代码知道我的意图(自动生成get / set方法)。

当然,根据Why we have to synthesize?,我们编写@synthesize来生成get / set方法。但我的问题是为什么标题中的@property不足以支持此?  我问,因为每当我在标题中写@property时,我立即转到实现并写@synthesize。因此,对我而言,使用@synthesize的唯一原因是补充@property关键字。这似乎相当多余,并且让我假设@synthesize如果不是因为有其他用途则不存在。那些其他用途是什么?

3 个答案:

答案 0 :(得分:5)

@synthesize做了两件事。它生成getter / setter对,并为属性创建iVar。

在这两件事情中,我认为iVar的创建是我使用@synthesize时的关键,而当我不使用的时候。为非内部存储为iVar的成员创建属性时,(显然)我不使用@synthesize

即将推出的自动合成功能不会有太大帮助。我总是用领先的'_'命名我的iVars,所以我仍然需要明确地合成它们。

请参阅@AndrewMadsen链接:它看起来像'_'前缀自动合成将生成iVars。

W00t!毋庸置疑,我现在对自动合成更加兴奋!!

答案 1 :(得分:2)

为了完整性/便利性,我们讨论了默认情况下合成的WWDC 2012会话的链接大约1/3:

https://deimos.apple.com/WebObjects/Core.woa/BrowsePrivately/adc.apple.com.16351707109.016351707115.16481294849?i=1846824472(视频通过iTunes)

http://adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_405__modern_objectivec.pdf(演示幻灯片的.pdf)

答案 2 :(得分:0)

当它为实例变量生成getter和setter时,无论是内部使用还是从类外部使用,真正的魔法都可以在setter中找到,就像它执行以下操作一样:

- (void)setValue: (id)newValue
{
    if (value != newValue)
    {
        [value release];
        value = newValue;
        [value retain];
    }
}

这适用于@property (nonatomic, retain)...

真正的魔力是,每次设置实例变量(从对象本身内部或外部)都要确保您拥有传递的newValue(带保留),释放旧值并设置新价值 因此可以多次设置实例变量,而无需手动释放旧的变量。这只是速度选项: - )