Objective C confusion - 将sythesized vars设置为ivars

时间:2009-09-17 19:32:47

标签: iphone objective-c

我注意到在一些例子中我已经看到你将引擎(类变量)设置为_engine(ivar)。我不明白。这是怎么回事?

以下是我所说的一个例子: @synthesize engine = _engine,delegate = _delegate

4 个答案:

答案 0 :(得分:9)

此语法将属性映射到具有不同名称的实例变量(ivar)。

所以:

@synthesize engine = _engine;

将创建访问 _engine ivar而不是引擎的属性访问器方法。您仍然可以访问该属性:

object.engine

Apple developer documentation on properties中的更多信息(属性实施指令部分)

答案 1 :(得分:4)

作者希望确保直接访问ivar和通过setter / getter访问之间没有混淆。如果名称相同,通常情况下,很容易写: engine = 0而不是self.engine = 0;对于需要保留的ivar,例如NSString,这可能会导致保留计数出错。

将ivars命名为前导“_”,“m”或“f”也具有历史优先权,因此他们很容易被认为是伊娃。

答案 2 :(得分:3)

@ synthezise关键字告诉Objective-C编译器为您的属性生成getter和setter方法。如果您已定义:

@property(copy,nonatomic) NSString* name;

然后@synthesize name;将为您创建这两种方法,这样您就不必实现它们了:

-(NSString*)name;
{
  return name;
}
-(void)setName:(NSString*)newName;
{
  if (name != newName) {
    [name release];
    name = [newValue copy];
  }
}

默认情况下,用作合成属性的后备存储的实例变量的名称与该属性的名称相同。这并不总是你想要的,然后你可以合成@synthesize name = _otherName;来告诉编译器为你生成这段代码:

-(NSString*)name;
{
  return _otherName;
}
-(void)setName:(NSString*)newName;
{
  if (_otherName != newName) {
    [_otherName release];
    _otherName = [newValue copy];
  }
}

您通常在用作带有下划线字符“_”的属性的后备存储的实例变量前缀的原因是为了帮助您记住不要直接访问它们。

答案 3 :(得分:0)

如果ivar的名称与合成var的名称不完全匹配,那么您需要将ivar映射到var。如果您希望在ivars前加下划线,则可能需要执行此操作。