在Xcode中创建了一个空项目,该项目仅用一个窗口对象设置App Delegate。
当AppDelegate.h为window创建@property时
@property (strong, nonatomic) UIWindow *window;
在ivar _window的.h或.m中都没有提到,但是dealloc显示:
- (void)dealloc
{
[_window release];
[super dealloc];
}所以我的问题是,@property是否会自动为该属性的关联ivar创建一个带有下划线的ivar?我认为除非你写一些像@synthesize window=_window这样的东西,否则属性和ivars应该有相同的名字。但是,.m中没有这样的(或任何) @synthesize语句,那么_window从何而来?
发布于 2012-08-26 20:01:10
Xcode4.4的默认编译器LLVM4.0提供了一个称为自动合成的新特性,该特性将自动合成已声明的属性(除非它们在协议中声明)。除了合成getter和setter (如果需要)实现之外,自动合成还将合成一个以下划线为前缀的实例变量。所以给出下面的声明。
@property (strong, nonatomic) NSString *foo;...the编译器将合成一个名为_foo的实例变量,以及访问_foo的foo和setFoo:方法实现。
发布于 2012-08-26 16:30:59
不需要,对应的ivar是由@property / @synthesize机制自动创建的。编译器使用默认的命名约定自动创建ivar ( ivar的名称等于属性名),您看不到它,但它存在,您可以引用它。
使用以下语句:
@synthesize window=_window; 您正在合成一个具有等于默认值的ivar名称的属性。
您可以通过以下方式为ivar指定不同于默认名称的其他名称:
@synthesize window=iVarWindow;笔记
在第一种情况下,您将为ivar指定一个名称,并在前面加上下划线(在默认实现中,ivar的名称将与属性的名称相同),而在第二种情况下,您将指定一个自定义名称。
如果你不合成属性(使用实现文件中的@synthesize ),编译器不会自动生成访问器方法,在这种情况下,你必须自己编写访问器方法,否则你将不会拥有它们!不管怎样,ivar是由@property创建的,所以即使你没有@synthesize,你也有与属性相关的ivar,否则你怎么能够在没有ivar的情况下编写自己的访问器方法的实现呢?:-)
更新
在Xcode4.4的新版本中,即使没有属性的和@synthesize语句,编译器也会自动生成访问器方法。
https://stackoverflow.com/questions/12128689
复制相似问题