iOS Xcode 4 属性访问

5

我最近切换到了Xcode 4,但对于这种新的写访问器的方式并不是很理解。例如,在创建新项目时自动生成的应用程序委托类中,window 对象没有在 @interface 中声明,而是以这种方式:

@property (nonatomic, retain) IBOutlet UIWindow *window;

然后,在实现文件中,我们有@synthesize window=_window;。 在函数中,我们要么使用self.window,要么使用_window

例如:

[self.window makeKeyAndVisible]; // in didFinishLaunchingWithOptions function
[_window release]; // in dealloc function

你能为我解释一下,为什么在 @interface 中没有任何内容,为什么我们要使用 @synthesize window=_window; 而不是 @synthesize window;,以及 self.window_window 之间的区别是什么?我的意思是,我什么时候需要调用其中一个而不是另一个?
我有点迷失了,并且感觉我正在尝试做同样的新代码并不能正常工作...
谢谢!
2个回答

15
  1. "为什么在 @interface 中没有任何内容?"

    运行时会为您合成ivar。

  2. "为什么我们要做 @synthesize window=_window;"

    这意味着 window 属性将使用名为 _window 的ivar(默认情况下,ivar的名称是属性的名称)。

  3. "self.window_window 有什么区别?"

    前者使用 window 的“getter”方法(即 foo = [self window]),而后者直接访问ivar。

  4. "为什么我要调用一个多于另一个的方法?"

    通常认为在 dealloc 方法中使用访问器方法是不安全的,因此使用ivar更可靠。


2
这与Xcode 4无关。这是Objective-C 2.0(Xcode 4创建项目模板时默认使用的语法)。
我建议阅读Objective-C编程语言中有关属性的章节,那会使事情变得更加清晰。
但“以前的方法”仍然有效。你不必一夜之间改变所有,如果你不喜欢自动生成的代码,只需将其删除,直到你感觉舒适使用新的语法为止。

是的,我已经阅读了所有的Objective-C编程语言指南,我还记得@synthesize window=_window;。只是需要一些更新来让我的思路更加清晰,你们帮了我很大的忙。感谢@puzzle提供的额外信息! - Dachmt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接