很抱歉阅读不久。这是我困惑的书的一部分。
编码约定的当前趋势(Xcode 4采用)是 使用下划线(_)作为实例的前导字符 变量名。所以你在模板代码中看到的任何引用 由Xcode生成的以_开头的变量引用了 实例变量直接按名称。当你看到@synthesize时 看起来像这样的指令
@synthesize window = _window;
为什么首先不能在@ propterty / synthesize中声明_window
而不是将其分配给window
?
它说要为名为的属性合成getter和setter 窗口并将该属性与名为的实例变量相关联 _window(不必显式声明)。这有助于区分实例变量与属性的使用和 鼓励您设置和检索实例变量的值 通过setter和getter方法。就是说,写点东西 此
[window makeKeyAndVisible]; //这不起作用
将失败,因为没有名为window的实例变量。相反,你 必须直接按名称命名实例变量,例如 如
[_ window makeKeyAndVisible];
或者,最好使用访问者方法:
[self.window makeKeyAndVisible];
为什么self.window
在其他方法没有时需要下划线?
答案 0 :(得分:0)
语法self.window
实际上是在调用一个方法(虽然它似乎没有)。例如,如果您@synthesize
@property
名为window
或,您自己定义了- (id) window { ... }
这样的方法,self.window
将调用该方法并表示返回的任何值。同样,self.window = value;
会为您隐式调用[self setWindow:value]
。
@property
可以重命名这些默认方法,例如使用getter=
。
答案 1 :(得分:0)
您只能访问setter / getter方法中的下划线ivars。在这种情况下,它将在- (UIWindow *)window
和- (void)setWindow:(UIWindow *)window
的实现中。在班级实现的其他任何地方,请参考@property
而不是合成的ivar(self.window
)。在我早期的obj-c时代帮助我理解的一件事是:self.window = ...;
是[self setWindow:...];
的同义词只要遵守规则,你就会很开心
Apple的Objective-C内部实现会产生一些极其漂亮的内存管理,只要您遵守规则,就无需处理。典型的Apple,但它有效。