Xcode 4.5 Interface Builder将下划线添加到插座

eat*_*rig 8 xcode properties objective-c outlet

Xcode 4.5是否具有稍微不同的自动生成属性及其关联的内存释放部分(在dealloc和viewDidUnload中)?

我昨天从4.5 Beta 1升级到Xcode 4.5.现在,当我使用Interface Builder创建一个插座时(通过Ctrl-dragging,比如UILabel到相关的头文件),它会@property像往常一样在标题中创建声明:

@property (retain, nonatomic) IBOutlet UILabel *propertyName;
Run Code Online (Sandbox Code Playgroud)

但是,在关联的.m文件中,没有@synthesize声明.

代码viewDidUnload是正常的:

- (void)viewDidUnload {
    [self setPropertyName:nil];
    [super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud)

但是,代码中的属性名称dealloc前缀为_:

- (void)dealloc {
    [_propertyName release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

这也意味着我不能将该属性引用为normal([propertyName doSomething];)

有什么变化吗?或者我不小心碰巧改变了一些设置?

Dar*_*ren 14

是的,Xcode 4.5中的行为略有改变.

...在关联的.m文件中,没有@synthesize声明.

在Xcode 4.5中,@synthesize语句现在是可选的,属性是自动合成的.因此,@synthesize不再需要添加自动生成的IBOutlet属性,因为它不再需要.

... dealloc中的代码在属性名称上加上_

当自动合成属性(没有显式的@synthesize语句)时,相应的实例变量前缀为下划线.这就是为什么它在你的dealloc方法中显示出来的原因.这样实例变量和属性名称不重叠.

这也意味着我无法正常引用该属性

不可以.访问实例变量和属性没有改变.所有已更改的是实例变量的默认名称.例如:

_foo = @"Bar"; // Setting an instance variable directly.
self.foo = @"Bar";  // Setting an instance variable via a property accessor method.
Run Code Online (Sandbox Code Playgroud)

下划线仅仅是一种风格问题,因此您更清楚的是您正在访问实例变量而不是属性.

请注意,您可以自己添加@synthesize语句,这将强制相应实例变量的名称为您想要的名称.同样,如果添加自己的属性访问器方法,则会阻止实例变量自动生成.