Iphone @synthesis window=\u window做什么?

Iphone @synthesis window=\u window做什么?,iphone,objective-c,Iphone,Objective C,我知道,@synthetic window与@property“auto”相结合,创建了您的setter和getter,但我不确定当您指定一个类似 @synthesize searchBar = _searchBar; 这是否意味着我可以简单地在我的方法中使用_searchBar而不是self.searchBar 它是为了防止ivar名称冲突,例如与此委托方法冲突: - (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSSt

我知道,
@synthetic window
@property
“auto”相结合,创建了您的setter和getter,但我不确定当您指定一个类似

 @synthesize searchBar = _searchBar;
这是否意味着我可以简单地在我的方法中使用_searchBar而不是self.searchBar

它是为了防止ivar名称冲突,例如与此委托方法冲突:

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

它是否等同于
self.searchBar
,而不是
searchBar
,或者这两者是相同的

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

@synthesize searchBar = _searchBar;
does是声明搜索栏的支持变量将被称为
\u searchBar
。这允许您将属性的名称与变量的名称分离。事实上,如果不使用
@synthesis
,则根本不需要有支持变量

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

  • 避免与变量名和
  • 当我使用局部变量和实例变量时要弄清楚
  • 表示为实例变量_searchBar创建一个名为“searchBar”(等)的getter方法


    _searchBar变量上的下划线通常表示“除非您确实知道自己在做什么,否则不要直接访问我。请改用getter和setter方法!”。

    文档中描述了语法--请参阅

    更改实例变量名的原因正是为了阻止直接访问。按惯例使用下划线。(注意:虽然当前警告不使用下划线,但此建议已过时。)

    同样,根据文档(请参阅),除了init和dealoc方法之外,您应该始终使用访问器方法。使用set访问器可确保正确管理内存,并在适当时发出KVO更改通知。您可以使用get访问器来确保属性已正确初始化。在一些常见的地方,属性的初始化比较缓慢;如果你不使用访问器,你会得到零

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

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

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

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

    'u searchBar变量上的下划线通常表示…'-这只是一种约定吗?这似乎是Objective C中一种较为常见的约定。这就是现在使用的约定苹果的自动属性合成编译器。谢谢你的详细回答。你能解释一下吗:“恰恰是为了阻止直接访问”。也许有一个直接访问、间接访问的代码示例“……几乎总是……”这是由编译器还是程序员决定的?您能否提供支持变量不存在的示例?由程序员确定。支持变量不存在的示例是
    UITableViewController
    中的
    self.tableview
    。获取该属性将返回与
    self.view
    返回的视图相同的视图。
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];