0

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

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

@synthesize property = _ivar;

我觉得这有点奇怪。我之前刚刚从事过一个 iOS 项目,但是当我做 ivar 和 property 时,它具有相同的名称。然后我会简单地合成属性,一切都是笨拙的。

为什么这个人做事不一样?我错过了什么?

4

4 回答 4

1

在某个地方,_var当开发人员应该引用self.property. 现在已经确定,使用最新的工具,您可以@synthesize完全删除线条并@synthesize x = _x;自动模拟。

于 2012-12-05T12:29:41.303 回答
0

你不会错过任何东西,它是一种风格的选择。使用这种_ivar方式时,您不能轻易地与 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一个具有该名称的 ivar 。但是最好使用语法_tableView通过属性访问变量。self.tableView

对此有一个例外,如果您在哪里重新引入已经存在于超级调用中的属性,则必须调用@synthesize. 它将再次为您创建“_ivar”。

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

于 2012-12-05T12:27:00.927 回答
0

这种做法迫使您使用属性调用和设置您的 iVar。如果你想使用iVar,你通过_iVar调用它,否则没有机会直接调用iVar而不使用属性错误。它会显示错误,你会被提醒哦,我需要输入自我。

于 2012-12-05T12:33:08.043 回答
0

在最新版本的 XCode 中,您不需要合成,它会为您完成。但又是一个下划线。

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

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

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

于 2012-12-05T13:26:49.233 回答