@synthesize window = _window是做什么的?

我明白,@ @synthesize window; 结合@property '自动创build'你的setter和getters,但我不确定究竟发生了什么,当你分配一个值

  @synthesize searchBar = _searchBar; 

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

用这种委托方法来防止伊娃名字发生冲突:

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

这是相当于self.searchBar而不是searchBar或者是这两个相同的呢?

你的属性几乎总是有一个后备variables。 什么

 @synthesize searchBar = _searchBar; 

是声明您的search栏的支持variables将被称为_searchBar 。 这使您可以将属性的名称与variables的名称分开。 事实上,如果你不使用@synthesize你根本不需要有一个后备variables。

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

  1. 避免与variables名称和
  2. 当我使用一个局部variables和当我使用一个实例variables时要清楚。
 @synthesize searchBar = _searchBar; 

说为实例variables_searchBar做一个名为“searchBar”(等)的getter方法。

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

语法在文档中描述 – 请参阅属性实现指令 。

更改实例variables名称的原因正是为了阻止直接访问。 约定使用下划线。 (注意:虽然编码指南目前警告不要使用下划线,但这个build议已经过时了。)

除了init和dealloc方法之外,每个文档(请参阅使用访问器方法 )都应该使用accessor方法。 您使用set访问器来确保正确pipe理内存,并在适当的情况下发出KVO更改通知。 您使用get访问器来确保该属性被正确初始化。 有几个地方懒惰地初始化房地产; 如果你不使用访问器,你会得到零…

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

 NSFetchRequest *request = ...; NSError *error = nil; NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error]; 

代替

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

那么 – 因为托pipe对象上下文是在访问器方法中懒洋洋地创build的 – 您最终可能会发送一条消息给nil并且没有结果。