这些代码行会相互影响吗?

时间:2012-12-15 02:52:17

标签: objective-c ios xcode

我正在App Store中收听/观看Paul Hegarty的教程。在他的课程中,他声明你应该总是在实现文件中综合你的属性,如下所示:

@sysnthesize example = _example;

我也在做一个不合成属性的苹果文档教程。它也有如下的init方法:

- (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

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

用“这些相互作用”来思考它可能不是正确的心理模型。开始的地方是了解每条线的作用。所以让我们考虑每个例子中的一个:

@synthesize name = _name;

如果存在名为name的属性(@property,通常在.h中),那么这会做一些事情:

  1. 它创建了两个方法,名为-setName:和-name,它们设置并获取实例变量_name
  2. 如果名为_name的实例变量不存在,则会创建一个
  3. 现在是另一个例子:

    _name = name;
    

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

    现在,我们了解他们的行为,让我们考虑一下他们的互动方式:

    1. 如果没有名为_name的显式实例变量要分配给,那么第二行将不会编译。第一行是单向以确保存在该名称的实例变量
    2. 如果设置name属性(通过点表示法或-setName方法,它没有区别),那么将通过@synthesize语句创建的方法修改相同的_name实例变量
    3. 如果在代码中使用_name,或者使用点表示法或-name方法,则它将具有最近通过这两种方式分配给它的值。
    4. 执行_name = name而不是self.name = name;不会调用-setName:方法,这意味着除了set之外它所做的任何事情(例如:保留参数)都不会发生。
    5. 另外一个考虑因素: 在Xcode的最新版本中,如果你将它放在一边,编译器会自动为你提供@synthesize语句。这是一件好事(打字少,冗余少,错误少),但如果你不期待它可能会让人感到困惑。例如,我的上述第1点将不适用于新版本。