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

Objective c 这些代码行会相互影响吗?,objective-c,ios,xcode,Objective C,Ios,Xcode,我正在App Store上收听/观看关于Paul Hegarty的教程。在他的课程中,他指出您应该始终在实现文件上合成属性,如下所示: @sysnthesize example = _example; 我也在做一个苹果文档教程,它不合成属性。它还具有如下初始化方法: - (id)initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date { self = [super init];

我正在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

谢谢你的帮助

从“这些会相互作用”的角度来思考,可能不是正确的思维模式。首先要了解每一行的作用。让我们从每个例子中考虑一个:

@synthesize name = _name;
如果存在一个名为name的属性(@property,通常在.h中),那么这将执行以下操作:

  • 它创建了两个名为-setName:和-name的方法,用于设置和获取实例变量\u name
  • 如果名为_name的实例变量不存在,它将创建一个实例变量
  • 另一个例子是:

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

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

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