@synthesize window = _window做什么?

Gaz*_*zer 36 iphone objective-c

我知道@synthesize window;结合@property'自动创建'你的setter和getter,但我不确定当你分配一个像这样的值时会发生什么

 @synthesize searchBar = _searchBar;
Run Code Online (Sandbox Code Playgroud)

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

是否使用此委托方法防止ivar名称的冲突:

- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
Run Code Online (Sandbox Code Playgroud)

它是否相当于self.searchBar而不是searchBar或者那两个相同?

kub*_*ubi 32

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

@synthesize searchBar = _searchBar;
Run Code Online (Sandbox Code Playgroud)

声明会调用搜索栏的支持变量_searchBar.这允许您将属性的名称与变量的名称分离.事实上,如果您不使用@synthesize,则根本不需要支持变量.

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

  1. 避免与变量名称冲突
  2. 当我使用局部变量时以及当我使用实例变量时,请说清楚.

  • 由程序员决定.不存在backing-varible的例子是`UITableViewController`中的`self.tableview`.获取该属性将返回与`self.view`返回的视图相同的视图. (2认同)

mma*_*alc 18

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

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

根据文档(请参阅使用访问器方法),除了init和dealloc方法之外,您应该始终使用访问器方法.您可以使用set访问器来确保正确管理内存,并在适当时发出KVO更改通知.您使用get访问器来确保正确初始化该属性.有几个常见的地方懒惰地初始化属性; 如果你不使用访问者,你会得到零...

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

NSFetchRequest *request = ...;
NSError *error = nil;

NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)

代替

NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)

然后 - 因为托管对象上下文是在访问器方法中懒惰创建的 - 您最终可能会向nil发送消息并且没有结果.


hot*_*aw2 17

@synthesize searchBar = _searchBar;
Run Code Online (Sandbox Code Playgroud)

说为实例变量_searchBar制作名为"searchBar"(等)的getter方法.

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

  • 它似乎是目标C中适度的惯例. (3认同)