我一直在为iPhone上的Core Data做一些教程,但似乎都没有。幸运的是,其中一个教程网站提供了源代码和一个不断弹出的问题(希望解释为什么所说的教程不起作用),是这一行:
@synthesize window = _window;
我的tableview文件中会自动生成大约6个这样的合成,但是没有一个教程使用它们,这给我带来了很多错误。工作源代码中的行是:
@synthesize window;
那么,为什么呢?我在网上看到@synthesize
的第一个版本用于内存管理,但似乎没有人使用它。
答案 0 :(得分:1)
这里唯一的区别在于实例变量在自动生成时的命名方式。
使用此版本:
@synthesize window = _window;
您有效地获得了这些(假设您尚未将@property
设置为readonly
):
UIWindow *_window;
- (UIWindow *)window;
- (void)setWindow:(UIWindow *)aWindow;
使用其他版本:
@synthesize window;
你明白了:
UIWindow *window;
- (UIWindow *)window;
- (void)setWindow:(UIWindow *)aWindow;
第二个版本相当于:
@synthesize window = window;
答案 1 :(得分:1)
这样的陈述:
@synthesize window = _window;
表示window
是映射到实例/成员变量_window
的属性。
Wheras
@synthesize window;
与
相同@synthesize window = window;
答案 2 :(得分:0)
我在使用的教程中遇到了同样的问题。
对于我的东西,我可以让它以最小的改变工作的方式是添加
头文件接口部分中的UIWindow *window;
,因为这并没有被Xcode自动添加,但教程的内容是预期的。
[window addSubview:tabBarController.view];
到
[self.window addSubview:tabBarController.view];
这似乎现在有效。我正在阅读的教程基于Xcode的早期版本,因此我认为事情已经发生了变化。 UIWindow行未自动添加,Xcode已开始使用_window
作为自己的东西。
但是,如果有人能给出一个更明确的解释,我会很高兴,因为我在黑暗中磕磕绊绊。
答案 3 :(得分:-2)
请勿使用单个前导下划线作为您的ivar或方法名称的前缀。这是一个Apple 内部编码约定,他们这样做是为了让他们的符号不会与你的符号冲突。
如果你综合一个属性并告诉它在已经有一个名为_window
的ivar的UIKit类的任何子类中使用_window
,那么你将会在套件中破坏代码。您可能会碰到的其他非常常见的ivar名称是_delegate
,_target
和_view
。