首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用"@synthesize slider =_slider“的意义是什么?

调用"@synthesize slider =_slider“的意义是什么?
EN

Stack Overflow用户
提问于 2011-10-11 17:56:24
回答 3查看 247关注 0票数 1

谁能给我解释一下创建(似乎是)额外变量的意义,以及为什么在与上一个变量同名的新变量前加下划线。

我读到它与创建实例变量有关,但为什么要将UI元素创建为实例变量?你能提供一个用例吗?

此目标c代码用于iOS开发。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 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不再是实例变量的名称。

票数 4
EN

Stack Overflow用户

发布于 2011-10-11 18:03:16

这样做的原因是为了让实例变量从属性点标记语法中清晰地表现出来。它还具有避免在参数名中隐藏实例变量的实际效果,这种情况在某些情况下也会发生。

在大多数情况下,使用实例变量的原因是为了避免在dealloc中触发KVO。如果这样做,可能会触发KVO,导致观察者将释放的对象传递给它们,从而导致EXC_BAD_ACCESS。

代码语言:javascript
复制
- (void)dealloc
{
    self.slider = nil;
    [super dealloc];
}

因此,通常会这样做,这不会触发KVO,因为您不需要进行属性访问。

代码语言:javascript
复制
- (void)dealloc
{
    [_slider release];
    [super dealloc];
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-11 18:05:14

这通常用于将属性合成为带有前缀或后缀的私有ivar。它试图防止您意外地访问ivar而不是属性,或者使用方法参数覆盖ivar。

请考虑以下内容:

代码语言:javascript
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7724249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档