ivars命名约定和@synthesis

时间:2012-07-26 02:50:06

标签: objective-c

很抱歉阅读不久。这是我困惑的书的一部分。

  

编码约定的当前趋势(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在其他方法没有时需要下划线?

2 个答案:

答案 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,但它有效。