关于iphone:@synthesize window = _window做什么?

What does @synthesize window=_window do?

我知道@synthesize window;@property自动创建你的setter和getter,但我不确定当你分配一个值时会发生什么

1
 @synthesize searchBar = _searchBar;

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

是否要防止ivar名称冲突,例如与此委托方法冲突:

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

它是等同于self.searchBar而不是searchBar,还是两者完全相同?


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

1
@synthesize searchBar = _searchBar;

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

至于人们为什么这样做,每个人都有不同的原因。就个人而言,我这样做是为了

  • 避免与变量名和
  • 当我使用局部变量和实例变量时,要清楚地说明这一点。

  • 语法在文档中进行了描述——请参见属性实现指令。

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

    同样,根据文档(请参见使用访问器方法),除了init和dealloc方法,您应该始终使用访问器方法。您可以使用set访问器来确保正确地管理内存,并在适当的情况下发出kvo更改通知。使用get访问器确保属性正确初始化。有几个常见的地方会延迟初始化属性;如果不使用访问器,则会得到nil…

    直接访问示例:使用核心数据模板之一,如果使用:

    1
    2
    3
    4
    NSFetchRequest *request = ...;
    NSError *error = nil;

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

    而不是

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

    然后——因为托管对象上下文是在访问器方法中延迟创建的——您可能最终会向nil发送一条消息,但没有得到任何结果。


    1
    @synthesize searchBar = _searchBar;

    表示为实例变量searchbar生成名为"searchbar"(等)的getter方法。

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