AppDelegate中的_window ivar

时间:2012-08-26 08:28:41

标签: objective-c

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

AppDelegate.h为@property创建window

@property (strong, nonatomic) UIWindow *window;

ivar .h的{​​{1}}或.m中没有提及,_window显示:

dealloc

所以我的问题是,- (void)dealloc { [_window release]; [super dealloc]; } 是否自动创建了一个带有下划线的ivar,用于属性的关联ivar?我认为除非你写@property之类的内容,否则属性和ivars的名称相同。但是@synthesize window=_window中没有此类(或任何)@synthesize语句,.m来自何处?

2 个答案:

答案 0 :(得分:2)

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

@property (strong, nonatomic) NSString *foo;

...编译器将合成名为_foo的实例变量以及访问foo的{​​{1}}和setFoo:方法实现。

答案 1 :(得分:1)

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

声明:

@synthesize window=_window; 

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

您可以通过以下方式指定与默认值不同的ivar的其他名称:

@synthesize window=iVarWindow;

备注

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

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


更新

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