3

我正在从 App Store 收听/观看关于 Paul Hegarty 的教程。在他的课程中,他指出您应该始终在实现文件上综合您的属性,如下所示:

@sysnthesize example = _example;

我也在做一个不综合属性的苹果文档教程。它也有像这样的初始化方法:

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if (self)
    {
        _name = name;

        _location = location;

        _date = date;

        return self;
    }

    return nil;
}

@end

如果像这样将它们加在一起,它们是否会相互作用、取消或以其他方式相互混淆:

@implementation BirdSighting

@synthesize name = _name;

@synthesize location = _location;

@synthesize date = _date;

- (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if (self)
    {
        _name = name;

        _location = location;

        _date = date;

        return self;
    }

    return nil;
}

@end

谢谢您的帮助。

4

1 回答 1

4

从“这些是否会相互作用”的角度来思考它可能不是正确的心智模型。开始的地方是了解这些行中的每一行的作用。因此,让我们从每个示例中考虑一个:

@synthesize name = _name;

如果存在名为 name 的属性(@property,通常在 .h 中),则执行以下操作:

  1. 它创建了两个方法,称为 -setName: 和 -name,用于设置和获取实例变量 _name
  2. 如果一个名为 _name 的实例变量不存在,它会创建一个

现在另一个例子:

_name = name;

这做一件事;它将“name”的地址分配给实例变量_name。

所以现在我们了解了它们的作用,让我们考虑它们是如何相互作用的:

  1. 如果没有明确的名为 _name 的实例变量可以赋值,那么第二行将不会编译。第一行是确保存在该名称的实例变量的一种方法
  2. 如果您设置 name 属性(通过点表示法或 -setName 方法,没有区别),那么这将通过 @synthesize 语句创建的方法修改相同的 _name 实例变量
  3. 如果您在代码中使用 _name,或者如果您使用点表示法或 -name 方法,它将具有最近通过这两种方式分配给它的值。
  4. 做 _name = name 而不是 self.name = name; 不会调用 -setName: 方法,这意味着除了 set 之外它所做的任何事情(例如:保留参数)都不会发生。

另一个注意事项:在最近的 Xcode 版本中,如果您将其省略,编译器会自动为您放入 @synthesize 语句。这是一件好事(更少的打字,更少的冗余,更少的错误),但如果你没有预料到它可能会令人困惑。例如,我上面的第 1 点不适用于新版本。

于 2012-12-15T03:25:47.887 回答