@synthesize window = _window做什么?

时间:2011-03-02 16:47:00

标签: iphone objective-c

我了解@synthesize window;@property相结合'自动创建'你的二传手和吸气者,但我不确定当你指定一个像

这样的值时会发生什么
 @synthesize searchBar = _searchBar;

这是否意味着我可以简单地在我的方法中使用_searchBar而不是说self.searchBar?

是否可以使用此委托方法阻止ivar名称的冲突:

- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

它是等同于self.searchBar而不是searchBar还是那两个相同的?

3 个答案:

答案 0 :(得分:32)

您的属性几乎总是有一个支持变量。什么

@synthesize searchBar = _searchBar;

确实声明搜索栏的支持变量将被称为_searchBar。这允许您将属性的名称与变量的名称分离。实际上,如果您不使用@synthesize,则根本不需要支持变量。

至于为什么人们这样做,每个人都有不同的理由。就个人而言,我这样做

  1. 避免与变量名和
  2. 发生冲突
  3. 在我使用局部变量时和当我使用实例变量时明确说明。

答案 1 :(得分:18)

文档中描述了语法 - 请参阅Property Implementation Directives

更改实例变量名称的原因正是为了阻止直接访问。约定使用下划线。 (注意:虽然Coding Guidelines目前警告不要使用下划线,但此建议已过时。)

再次根据文档(参见Using Accessor Methods),除了init和dealloc方法之外,您应该始终使用访问器方法。您可以使用set访问器来确保正确管理内存,并在适当时发出KVO更改通知。您使用get访问器来确保正确初始化该属性。有几个常见的地方懒惰地初始化属性;如果你不使用访问者,你就会没有......

直接访问的示例:使用其中一个核心数据模板,如果您使用:

NSFetchRequest *request = ...;
NSError *error = nil;

NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error];

而不是

NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];

然后 - 因为托管对象上下文是在访问器方法中懒惰创建的 - 您最终可能会向nil发送消息并且没有结果。

答案 2 :(得分:17)

@synthesize searchBar = _searchBar;

表示为实例变量_searchBar制作名为“searchBar”(等)的getter方法。

_searchBar变量的下划线通常意味着“除非你真的知道你正在做什么,否则不要直接访问我。请改用getter和setter方法!”。