2011-10-12 35 views
2

我一直在为iPhone的核心数据做一些教程,并没有一个似乎工作。幸运的是,提供的源代码,并且保持雨后春笋般冒出来一个问题教程网站之一(而且是希望在解释为什么说教程不工作),是这一行:window = _window

@synthesize window = _window; 

半打综合类像这样会在我的tableview文件中自动生成,但没有任何教程使用它们,这对我造成了很多错误。工作源代码中的行是:

@synthesize window; 

那么,这是为什么?我在网上读到@synthesize的第一个版本是为了内存管理的目的,但似乎没有人使用它。

+0

此语法通常用于防止“意外”访问伊娃直接(一种可能的情况是通过其评估方法懒惰地创建变量时) – Rog

回答

1

这里唯一的区别是实例变量在自动生成时如何命名。

在这个版本:

@synthesize window = _window; 

你有效地获得这些(假设你没有设置@propertyreadonly):

UIWindow *_window; 
- (UIWindow *)window; 
- (void)setWindow:(UIWindow *)aWindow; 

有了另一个版本:

@synthesize window; 

你得到这个:

UIWindow *window; 
- (UIWindow *)window; 
- (void)setWindow:(UIWindow *)aWindow; 

第二个版本等于:

@synthesize window = window; 
1

声明这样的:

@synthesize window = _window; 

意味着window是映射到实例/成员变量_window的属性。

Wheras

@synthesize window; 

相同

@synthesize window = window; 
-2

切勿采用单前导下划线,为您的伊娃或方法名称的前缀。这是一个Apple 内部编码约定,并且它们这样做是为了使它们的符号不会与您的符号相冲突。

如果你合成一个属性,告诉它在已经有一个名为_window,你会在试剂盒中重挫代码伊娃一类的UIKit中的任意子类使用_window。其他可能与您碰撞的常见伊娃名称是_delegate_target_view

+0

这是一个公平点,但不回答问题。 – Rog

+4

如果您的建议是不使用下划线,那么当我使用iPhone模板时如何生成这些变量?他们在我触摸代码之前就在那里。 – user990769

+0

伟大的观察! NSResponder会回应吗? – TigerCoding

0

我一直与我一直在努力的教程有同样的问题。

对于我的东西,我可以通过最小的改变使它工作的方式是在头文件接口部分添加 UIWindow *window;,因为这不是由Xcode自动添加的,而是由教程内容预期的。

然后我改变了部分地方调用

[window addSubview:tabBarController.view]; 

[self.window addSubview:tabBarController.view]; 

这似乎现在的工作。我正在阅读的教程是基于以前版本的Xcode,所以我认为事情已经改变。 UIWindow行不会自动添加,并且Xcode已经开始使用_window作为自己的东西。

不管怎样,任何人都可以给出一个更清晰的解释,因为我在这里黑暗中磕磕绊绊。