Objective-C:为什么@synthesize预见到了一项任务?

时间:2011-04-19 09:47:11

标签: iphone objective-c ios

我注意到@synthesize指令承认对它收到的属性的赋值,我无法理解为什么。

我的意思是,我在应用程序委托的实现文件中有:

@synthesize window=_window;

如果我必须将属性合成到视图控制器的.m文件中,我可以简单地写一下:

@synthesize messageString;

未指定_messageString

我无法弄清楚为什么我需要以前的语法。

4 个答案:

答案 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分开。