1

在 Xcode 中创建了一个空项目,它仅使用窗口对象设置 App Delegate。

虽然 AppDelegate.h 创建了一个@propertyfor window

@property (strong, nonatomic) UIWindow *window;

.h在 ivar或.mivar中都没有提及,_window但是dealloc显示:

- (void)dealloc
{
[_window release];
[super dealloc];
}

所以我的问题是,是否会@property自动为属性的关联 ivar 创建一个带有下划线的 ivar?我认为除非您编写类似@synthesize window=_windowthen 属性和 ivars 的名称。但是,在中没有这样的(或任何)@synthesize声明,.m那么_window来自哪里?

4

2 回答 2

2

LLVM 4.0 是 Xcode 4.4 的默认编译器,它提供了一个名为auto-synthesis的新功能,它将自动合成声明的属性(除非它们在协议中声明)。除了合成 getter 和 setter(如果需要)实现之外,自动合成还将合成一个带有下划线前缀的实例变量。所以给出以下声明......

@property (strong, nonatomic) NSString *foo;

...编译器将合成一个名为的实例变量_foo以及访问.foosetFoo:_foo

于 2012-08-26T12:01:09.787 回答
1

不,对应的 ivar 是由@property/@synthesize机制自动创建的。编译器会自动创建默认命名约定的 ivar(ivar 的名称等于属性名称),你看不到它,但它存在,你可以引用它。

随着声明:

@synthesize window=_window; 

您正在合成一个 ivar 名称等于默认值的属性。

您可以通过以下方式为 ivar 指定与默认值不同的另一个名称:

@synthesize window=iVarWindow;

笔记

在第一种情况下,您为 ivar 指定一个名称,前面带有下划线(在默认实现中,ivar 的名称将等于属性的名称),而在第二种情况下,您指定一个自定义名称.

如果你不合成属性(@synthesize在实现文件中),编译器不会自动生成访问器方法,在这种情况下你必须自己编写访问器方法,否则你将没有它们!无论如何, ivar 是由创建的@property,所以即使你没有@synthesizeivar,你也有与属性相关的 ivar,否则你怎么能在没有 ivar 的情况下编写自己的访问器方法实现?:-)


更新

使用新版本的 Xcode 4.4,即使没有属性的 @synthesize 语句,编译器也会自动生成访问器方法。

于 2012-08-26T08:30:58.723 回答