2012-12-05 115 views
0

我刚刚继承了一个iOS项目,并且只是查询了有关ivars和属性的分配方式。声明一个iVar属性

在此项目中,ivars的名称与该属性相似,但以下划线开头。然后,当属性正在合成它是这样做的

@synthesize property = _ivar; 

我觉得这有点奇怪。我刚才在一个iOS项目上工作过,但是当我同时做这个伊娃和财产时,他们的名字都是一样的。然后,我会简单地综合该属性,一切都是h d。

这家伙为什么要做不同的事情?我错过了什么?

回答

1

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

+0

好吧,现在我很困惑。这家伙正在遵循这个公约。但是,在他的所有代码中,他引用_ivar而不是self.property?这是不正确的? – conor

+1

人们需要使用'_ivar'的主要地方是他们编写自定义的“getter”。在这种情况下,你不能写'self.property',因为它是对同一个“getter”方法的递归调用。除此之外大部分用途,我会考虑可疑,直到我看到确切的背景。 –

+0

那么这取决于,如果你使用'_var',那么KVO将不会被触发,也许这是以前的开发人员想要的。 – rckoenes

0

你不会错过任何东西,它是一种风格的选择。当使用_ivar的方式,你不能轻易地与ivar或财产犯错误。同样如Mike Weller所述,这是Apple建议的。

如果在使用委托时他们将与您的伊娃相同名称的发送传递给他们,也会有所帮助。例如:

如果你声明属性tableView并做伊娃一样,那么编译器会抱怨的方法重新声明变量tableView,如:

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

因为无论是类范围和方法范围含有变量名称tableView,您无法确切知道要使用哪一个。

在Xcode中的最新版本中,你甚至不必申报伊娃的更多,如果你头文件看起来是这样的:

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

然后,你甚至不用到@synthesize该财产的任何更,这是为你自动完成的,并且还会创建名称为_tableView的伊娃。但首选使用self.tableView语法通过属性访问变量。

这里有一个例外,如果您在哪里重新引入超级通话中已存在的房产,您必须致电@synthesize。它会再次为您创建'_ivar'。

另一个例外是,如果您使用的是原始类型,编译器将不会为您创建 _ivar。你不需要在标题中创建它们,你只需要做 @synthesize myInt = _myInt并为你创建伊娃。

+1

请注意,Apple现在建议您使用下划线前缀(请参阅WWDC 2012视频) –

+0

有趣的是,我习惯于反面。所有参数都以下划线开头。 : -/ – conor

+0

@conor违背了普通的Apple指南,但你可以随意使用你喜欢的任何东西。 – rckoenes

0

这种做法强制您调用并设置您的iVars使用属性。在你想使用iVar的地方,你用_iVar调用它,否则就没有机会直接调用iVar而不使用属性。它会显示错误,你会得到提醒,哦,我需要把自己。

0

在XCode的最新版本中,您无需综合,它可以为您提供帮助。但是再次强调一下。

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

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

但我会建议遵循苹果准则使用_property。