在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
来自何处?
答案 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语句属性,编译器也会自动生成访问器方法。