What does @synthesize window=_window do?
我知道
1 | @synthesize searchBar = _searchBar; |
这是否意味着我可以简单地在我的方法中使用搜索栏而不是说self.searchbar?
是否要防止ivar名称冲突,例如与此委托方法冲突:
1 | - (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText |
它是等同于
您的属性几乎总是有一个支持变量。什么
1 | @synthesize searchBar = _searchBar; |
是否声明搜索栏的支持变量将被称为
至于人们为什么这样做,每个人都有不同的原因。就个人而言,我这样做是为了
语法在文档中进行了描述——请参见属性实现指令。
更改实例变量名的原因正是为了阻止直接访问。约定使用下划线。(注意:尽管编码准则目前警告不要使用下划线,但此建议已过时。)
同样,根据文档(请参见使用访问器方法),除了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方法!".