我刚刚继承了一个iOS项目,只是询问了ivars和属性的分配方式。
在这个项目中,ivars的命名与属性相似,但以下划线开头。然后,当合成属性时,就像这样完成
@synthesize property = _ivar;
我发现这有点奇怪。我之前刚刚参与过一个iOS项目,但当我做的时候,ivar和属性都有相同的名字。然后我会简单地合成这个属性,一切都很笨拙。
为什么这个人以不同的方式做事?我错过了什么?
答案 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。