所以我在头文件中使用@property
键。
如果我这样做,我应该在我的实现中使用@synthesize
密钥,对吧?但我想知道,是否有一个真正的原因我必须这样做?我只是想知道为什么不在标题中写@property
就足以让代码知道我的意图(自动生成get / set方法)。
当然,根据Why we have to synthesize?,我们编写@synthesize
来生成get / set方法。但我的问题是为什么标题中的@property
不足以支持此?
我问,因为每当我在标题中写@property
时,我立即转到实现并写@synthesize
。因此,对我而言,使用@synthesize
的唯一原因是补充@property
关键字。这似乎相当多余,并且让我假设@synthesize
如果不是因为有其他用途则不存在。那些其他用途是什么?
答案 0 :(得分:5)
@synthesize
做了两件事。它生成getter / setter对,并为属性创建iVar。
在这两件事情中,我认为iVar的创建是我使用@synthesize
时的关键,而当我不使用的时候。为非内部存储为iVar的成员创建属性时,(显然)我不使用@synthesize
。
即将推出的自动合成功能不会有太大帮助。我总是用领先的'_'命名我的iVars,所以我仍然需要明确地合成它们。
请参阅@AndrewMadsen链接:它看起来像'_'前缀自动合成将生成iVars。
W00t!毋庸置疑,我现在对自动合成更加兴奋!!
答案 1 :(得分:2)
为了完整性/便利性,我们讨论了默认情况下合成的WWDC 2012会话的链接大约1/3:
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(带保留),释放旧值并设置新价值 因此可以多次设置实例变量,而无需手动释放旧的变量。这只是速度选项: - )