@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。
至于为什么这样做,每个人都有不同的理由。 就我个人而言,
- 避免与variables名称和
- 当我使用一个局部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并且没有结果。