谁能给我解释一下创建(似乎是)一个额外变量的意义,为什么在一个与上一个同名的新变量之前放一个下划线?
我已经读到,这是做与创建实例变量,但为什么你要创建一个UI元素作为实例变量?您能提供一个用例吗?
用于iOS开发的目标c代码。
谢谢。
当你@synthesize
一个属性,你不提供自己的getter和setter方法(在这种情况下,没有必要@synthesize
),然后总是有一个新的实例变量创建。默认情况下,它获得与属性相同的名称。因此,@synthesize slider;
在后台创建了一个实例变量slider
。
这里的问题是,当您真正想使用self.slider = xxx
时,您可能会错误地键入slider = xxx
。当你把某些东西作为属性时,最佳实践是你应该总是通过self.propertyName
来访问它(除了在你的init和dealloc方法以及任何自定义的getter和setter方法中)。
因此,为了避免这种情况,使用@synthesize
语句将后备变量重命名为更难以与属性混淆的名称。如果您现在使用slider
而不是self.slider
,编译器将给出错误消息,因为slider
不再是实例变量的名称。
这样做的原因是为了使实例变量从属性点分隔语法中明显地脱颖而出。它还具有实际效果,可以避免在参数名称中隐藏实例变量,这种情况在某些情况下也会发生。
在大多数情况下,使用实例变量的原因是为了避免在dealloc中触发KVO。如果您这样做,您可能会以这样的方式触发KVO,即您的观察者获得传递给它们的已分配对象,从而导致EXC_BAD_ACCESS。- (void)dealloc
{
self.slider = nil;
[super dealloc];
}
所以通常这样做,这不会触发KVO,因为你不做属性访问。
- (void)dealloc
{
[_slider release];
[super dealloc];
}
这通常用于将属性合成为带有前缀或后缀的私有变量。它试图防止您意外访问ivar而不是属性或使用方法参数重写ivar。
考虑一下:
@implementation MYClass
@synthesize flag = flag_;
- (void)doSomethingWithFlag:(BOOL)flag {
if (flag) {
// You do not need to worry about confusing the ivar
// flag and the param flag because it is synthesized to flag_
}
}
- (void)doSomething {
if (flag) { // Doesn't work -> use accessor self.flag
...
}
}
@end