-1

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

当前编码约定的趋势(Xcode 4 已采用)是使用下划线 (_) 作为实例变量名称的前导字符。因此,您在 Xcode 生成的模板代码中看到的对以 _ 开头的变量的任何引用都是直接按名称引用实例变量。当你看到一个看起来像这样的@synthesize 指令时

@synthesize 窗口=_window;

为什么不能_window首先在 @propterty/synthesize 中声明而不是将其分配给window

它说为名为 window 的属性合成 getter 和 setter,并将该属性与名为 _window 的实例变量相关联(不必显式声明)。这有助于区分实例变量和属性的使用,并鼓励您通过 setter 和 getter 方法设置和检索实例变量的值。也就是说,写这样的东西

[窗口 makeKeyAndVisible]; // 这行不通

将失败,因为没有名为 window 的实例变量。相反,您必须直接按其名称命名实例变量,例如

[_window makeKeyAndVisible];

或者,最好使用访问器方法:

[self.window makeKeyAndVisible];

为什么self.window其他方法不需要下划线?

4

2 回答 2

0

您只能在 setter/getter 方法中访问下划线 ivars。在这种情况下,它将在 和 的实现- (UIWindow *)window- (void)setWindow:(UIWindow *)window。在你的类的实现中的任何其他地方,引用@property而不是合成的 ivar( self.window)。在我早期的 obj-c 日子里,帮助我理解的一件事是:self.window = ...;[self setWindow:...];Just follow the rules and you'll be one happy 的同义词

Apple 对 Objective-C 的内部实现导致了一些非常漂亮的内存管理,只要你遵守他们的规则,你就永远不必处理它们。典型的苹果,但它有效。

于 2012-07-26T04:14:25.923 回答
0

该语法self.window实际上是在调用一个方法(尽管看起来可能不是)。例如,如果您命名定义了一个像您自己一样的方法@synthesize,将调用该方法并表示返回的任何值。同样,隐含地呼唤你。@propertywindow - (id) window { ... }self.windowself.window = value;[self setWindow:value]

A@property可以重命名这些默认方法,例如使用getter=.

于 2012-07-26T02:54:35.880 回答