宣布iVar,财产

时间:2012-12-05 12:23:57

标签: objective-c ios

我刚刚继承了一个iOS项目,只是询问了ivars和属性的分配方式。

在这个项目中,ivars的命名与属性相似,但以下划线开头。然后,当合成属性时,就像这样完成

@synthesize property = _ivar;

我发现这有点奇怪。我之前刚刚参与过一个iOS项目,但当我做的时候,ivar和属性都有相同的名字。然后我会简单地合成这个属性,一切都很笨拙。

为什么这个人以不同的方式做事?我错过了什么?

4 个答案:

答案 0 :(得分:1)

在某些地方,当开发人员引用_var时,使用self.property表单作为保护以防止意外引用变量变得很常见。现在已经确定,使用最新工具,您可以完全删除@synthesize行,并自动模拟@synthesize x = _x;

答案 1 :(得分:0)

你没有遗漏任何东西,它是一种风格的选择。使用_ivar方式时,您不能轻易地将伊娃或财产弄错。同样如Mike Weller所述,这是Apple推荐的。

如果您使用委托,他们通过与您的ivar同名的发送,也可以提供帮助。例如:

如果声明属性tableView并对ivar执行相同操作,则编译器会抱怨在以下方法中重新声明变量tableView

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   // Dot some thing with the table object
}

因为类范围和方法范围都有变量名tableView,你无法确定使用哪一个。

在Xcode的最新版本中,如果头文件如下所示,您甚至不必再声明ivar了:

@interface MyTableViewController : UIViewController <UITableViewDelegate> 
    @property (nonatomic, weak) IBOutlet UITableView *tableView;
@end

然后您甚至不再需要@synthesize该属性,这是自动完成的,并且还会创建名为_tableView的ivar。但首选使用self.tableView语法通过属性访问变量。

这有一个例外,如果您要重新引入超级调用中已存在的属性,则必须调用@synthesize。它将再次为你创造'_ivar'。

另一个例外是,如果您使用原始类型,编译器将不会为您创建_ivar。您不需要在标题中创建它们{J} @synthesize myInt = _myInt并且为您创建了ivar。

答案 2 :(得分:0)

此练习会强制您使用属性调用和设置iVars。如果您想使用iVar,请通过_iVar调用它,否则将无法在不使用属性的情况下直接调用iVar。它会显示错误,你会得到提醒哦,我需要把自己。

答案 3 :(得分:0)

在最新版本的XCode中你不需要合成,它适合你。但再次以下划线。

但是,您可以通过声明@synthesize property=property;@synthesize property;来覆盖它,甚至您也会知道您可以提供任何其他名称@synthesize property=myproperty;

然而,最初只是风格问题,例如使用变量名称和动作名称,例如numberArray,nameTextField,cancelButton,但现在它很少被使用,人们被要求分别命名数字,名称,取消。

但我建议遵循苹果指南使用_property。