我了解@synthesize window;
与@property
相结合'自动创建'你的二传手和吸气者,但我不确定当你指定一个像
@synthesize searchBar = _searchBar;
这是否意味着我可以简单地在我的方法中使用_searchBar而不是说self.searchBar?
是否可以使用此委托方法阻止ivar名称的冲突:
- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
它是等同于self.searchBar
而不是searchBar
还是那两个相同的?
答案 0 :(得分:32)
您的属性几乎总是有一个支持变量。什么
@synthesize searchBar = _searchBar;
确实声明搜索栏的支持变量将被称为_searchBar
。这允许您将属性的名称与变量的名称分离。实际上,如果您不使用@synthesize
,则根本不需要支持变量。
至于为什么人们这样做,每个人都有不同的理由。就个人而言,我这样做
答案 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方法!”。