谁能给我解释一下创建(似乎是)额外变量的意义,以及为什么在与上一个变量同名的新变量前加下划线。
我读到它与创建实例变量有关,但为什么要将UI元素创建为实例变量?你能提供一个用例吗?
此目标c代码用于iOS开发。
谢谢。
发布于 2011-10-11 18:05:18
当您设置一个属性并且没有提供您自己的@synthesize和setter方法时(在这种情况下,不需要@synthesize),那么总是会创建一个新的实例变量。默认情况下,它的名称与属性相同。因此@synthesize slider;在幕后创建了一个名为slider的实例变量。
这里的问题是,当您真正想要使用self.slider = xxx时,您可能会错误地键入slider = xxx。当您将某些东西设置为属性时,最佳实践表明您应该始终通过self.propertyName访问它(除了在您的init和dealloc方法以及任何自定义的getter和setter方法中)。
因此,为了避免这种情况,@synthesize语句被用来将支持的ivar重命名为更难与属性混淆的名称。如果您现在使用slider而不是self.slider,编译器将给出一条错误消息,因为slider不再是实例变量的名称。
发布于 2011-10-11 18:03:16
这样做的原因是为了让实例变量从属性点标记语法中清晰地表现出来。它还具有避免在参数名中隐藏实例变量的实际效果,这种情况在某些情况下也会发生。
在大多数情况下,使用实例变量的原因是为了避免在dealloc中触发KVO。如果这样做,可能会触发KVO,导致观察者将释放的对象传递给它们,从而导致EXC_BAD_ACCESS。
- (void)dealloc
{
self.slider = nil;
[super dealloc];
}因此,通常会这样做,这不会触发KVO,因为您不需要进行属性访问。
- (void)dealloc
{
[_slider release];
[super dealloc];
}发布于 2011-10-11 18:05:14
这通常用于将属性合成为带有前缀或后缀的私有ivar。它试图防止您意外地访问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
...
}
}
@endhttps://stackoverflow.com/questions/7724249
复制相似问题