为什么我要声明两次属性?还是我?

时间:2013-02-28 12:57:16

标签: objective-c

对于那种无用的帖子标题感到抱歉,但由于我不确定我在做什么,这是我能想到的最好的。

在我的头文件中,它看起来像这样

@interface RootViewController : UITableViewController {
NSMutableArray *eventsArray;    
}

@property (nonatomic, retain) NSMutableArray *eventsArray;

@end

这不是所有的属性,但为了简单起见我删除了除了一个属性。

我是按照苹果开发者的指南来做到这一点的。似乎指南没有完全更新,因为它告诉我合成属性,我不应该再对了吗?

无论如何,为什么会这样?对我来说,这是一个初学者,好像我两次声明了这个属性?或者我在那里的第一行做其他事情?

2 个答案:

答案 0 :(得分:4)

由于历史原因,使用较旧的编译器就是这样。

你现在可以这样做:

@interface RootViewController : UITableViewController

@property (nonatomic, retain) NSMutableArray *eventsArray;

@end

你拥有它的方式,你声明了一个实例属性,然后你说你想要自动生成getter和setter。

现在,你可以说你有一个属性,编译器会在编译时自动生成实例属性。它消除了明显的冗余。

答案 1 :(得分:2)

  

对我来说,这是一个初学者,好像我宣布了这个属性   两次?或者我在那里的第一行做其他事情?

一个属性和备份它的实例变量(如果有的话)是两个不同的东西。属性实际上只是该类提供某些访问器方法的承诺。所以你必须分别声明属性和ivar并不奇怪。然而,事实上,大多数属性都是由具有相关名称的ivar支持,并且分别编写和维护这两个属性是一件苦差事。因此,Apple将ivar综合添加到编译器中,以便编译器为任何尚未存在ivar的合成属性生成ivar。此外,因为合成访问器是目前最常见的,并且因为即使属性标记为@synthesize,编译器也将使用您提供的任何访问器,这将成为默认设置,因此您不再需要编译器指令。 / p>