我注意到@synthesize指令承认对它收到的属性的赋值,我无法理解为什么。
我的意思是,我在应用程序委托的实现文件中有:
@synthesize window=_window;
如果我必须将属性合成到视图控制器的.m文件中,我可以简单地写一下:
@synthesize messageString;
未指定_messageString
。
我无法弄清楚为什么我需要以前的语法。
答案 0 :(得分:2)
它只允许您使用与关联实例变量不同的名称公开属性 - 这很有用,因为关于属性命名的约定已经很好地建立,但实例变量的约定定义得不太明确。
答案 1 :(得分:2)
如上所述,这是将ivar设置为与访问者分开。因此,在上面的window = _window代码中,您的访问器将如下所示。
- (UIWindow *)window
{
return _window;
}
- (void)setWindow:(UIWindow *)w
{
[w retain];
[_window release];
_window = w;
}
分离ivar和属性的通常原因是为了防止子类中的冲突。这样,子类可以创建一个名为window的变量,而不会与超类“window”发生冲突,因为它实际上是_window。
答案 2 :(得分:1)
这不是作业。它只是命名属性所基于的ivar。
答案 3 :(得分:1)
前一种语法(@synthesize window=_window
)允许您指定实例变量应具有与该属性不同的名称。我相信这对实现没有任何实际影响,但是这是一种很好的方式,可以确保您的公共访问者与私有ivar分开。