首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppDelegate中的_window ivar

AppDelegate中的_window ivar
EN

Stack Overflow用户
提问于 2012-08-26 16:28:41
回答 2查看 247关注 0票数 1

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

当AppDelegate.h为window创建@property

@property (strong, nonatomic) UIWindow *window;

在ivar _window.h.m中都没有提到,但是dealloc显示:

代码语言:javascript
复制
- (void)dealloc
{
[_window release];
[super dealloc];
}

所以我的问题是,@property是否会自动为该属性的关联ivar创建一个带有下划线的ivar?我认为除非你写一些像@synthesize window=_window这样的东西,否则属性和ivars应该有相同的名字。但是,.m中没有这样的(或任何) @synthesize语句,那么_window从何而来?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-26 20:01:10

Xcode4.4的默认编译器LLVM4.0提供了一个称为自动合成的新特性,该特性将自动合成已声明的属性(除非它们在协议中声明)。除了合成getter和setter (如果需要)实现之外,自动合成还将合成一个以下划线为前缀的实例变量。所以给出下面的声明。

代码语言:javascript
复制
@property (strong, nonatomic) NSString *foo;

...the编译器将合成一个名为_foo的实例变量,以及访问_foofoosetFoo:方法实现。

票数 2
EN

Stack Overflow用户

发布于 2012-08-26 16:30:59

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

使用以下语句:

代码语言:javascript
复制
@synthesize window=_window; 

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

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

代码语言:javascript
复制
@synthesize window=iVarWindow;

笔记

在第一种情况下,您将为ivar指定一个名称,并在前面加上下划线(在默认实现中,ivar的名称将与属性的名称相同),而在第二种情况下,您将指定一个自定义名称。

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

更新

在Xcode4.4的新版本中,即使没有属性的和@synthesize语句,编译器也会自动生成访问器方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12128689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档