objective-c – Xcode 4.5 Interface Builder将下划线添加到Outl
Xcode 4.5是否具有稍微不同的自动生成属性及其关联的内存释放部分(在dealloc和viewDidUnload中)?
我昨天从4.5 Beta 1升级到Xcode 4.5.现在,当我使用Interface Builder创建一个插座时(通过Ctrl,从UILabel拖动到相关的头文件),它会正常在标题中创建@property声明: @property (retain,nonatomic) IBOutlet UILabel *propertyName; 但是,在关联的.m文件中,没有@synthesize声明. viewDidUnload中的代码是正常的: - (void)viewDidUnload { [self setPropertyName:nil]; [super viewDidUnload]; } 但是,dealloc中的代码在属性名称上加上_: - (void)dealloc { [_propertyName release]; [super dealloc]; } 这也意味着我不能正常引用该属性([propertyName doSomething];) 有什么变化吗?或者我不小心碰巧改变了一些设置? 解决方法
是的,Xcode 4.5中的行为略有改变.
在Xcode 4.5中,@synthesize语句现在是可选的,并且属性是自动合成的.因此,自动生成的IBOutlet属性不再添加@synthesize,因为不再需要它.
当自动合成属性(没有显式的@synthesize语句)时,相应的实例变量前缀为下划线.这就是为什么它在你的dealloc方法中显示出来的原因.这样实例变量和属性名称不重叠.
不可以.访问实例变量和属性没有改变.所有已更改的是实例变量的默认名称.例如.: _foo = @"Bar"; // Setting an instance variable directly. self.foo = @"Bar"; // Setting an instance variable via a property accessor method. 下划线仅仅是一种风格问题,因此您更清楚的是您正在访问实例变量而不是属性. 请注意,您可以自己添加@synthesize语句,这将强制相应实例变量的名称为您想要的名称.同样,如果添加自己的属性访问器方法,则会阻止实例变量自动生成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |