synthesize propertyname = _propertyname 有什么区别

What is the difference between synthesize propertyname = _propertyname

我是 objective c 的新手。我在 class 的 .h 头文件中创建了一个 属性 然后我合成了。

有什么区别

@synthesize propertyname;

@synthesize propertyname = _propertyname;

两者都有效,但使用第一个或第二个的目的是什么。

感谢任何帮助。

首先你不用再写@synthesize propertyname

在 Objective-C 中,当您声明一个 属性 时,默认情况下编译器会自动为您生成访问器方法。这些访问器方法可以是 getter 和 setter 如果 属性 是可读写的 属性 否则只是 getter 如果它是只读的 属性。

编译器在这些访问器方法实现的幕后使用内部变量(称为 iVar)。 (显然,您可以提供自己对这些访问器方法的实现,也可以提供自己的内部变量)

@synthesize propertyname;@synthesize propertyname = _propertyname;

有什么区别

当你声明一个 @synthesize propertyname; 编译器自动生成并使用一个名为 propertynameiVar 并在其默认访问器实现中使用它,你也可以将它用作 propertyname 在你的 .m 文件中,因为编译器已经为你声明了它。

property = @"abcd";

当你声明一个 @synthesize propertyname = _propertyname; 编译器自动生成并使用一个名为 _propertyname 的 iVar 并在其默认访问器实现中使用它,你也可以在你的 .m 文件,因为编译器已经为您声明了它。

_property = @"abcd";

从广义上讲,这两个语句之间的一般区别只是 iVar 名称的变化(尽管用法不同)

what is the purpose of using the first one or the second one.

正如我已经提到的,您不需要在正常用例中使用它们中的任何一个。编译器已经为你做了。

当我们对 ivar 的名称没有任何特定保留,也不想将我们自己的私有变量 ivar 提供给特定 [=84] 时,我们曾经写 @synthesize propertyname; =](下面详细解释)。这比显式指定 iVar 的名称更简单,我们知道编译器将为我们生成与 属性 同名的 ivar

我们通常在 @synthesize propertyname; 不可用时或当我们希望我们的 iVar 遵循特定的命名法('_' 跟随 属性 的名称时,我们通常写 @synthesize propertyname = _propetyname ) 或者当我们想使用我们自己的私有变量作为 iVar 到 属性.

在这两种情况下,@synthesize 都很方便,因为它可以让我们免于编写样板代码,例如为声明的属性添加 settergetter 方法。

如何将自定义变量用作 ivar 用于 属性?

@interface SynthesizeExplorer : NSObject
@property (nonatomic,strong) NSString *name;
@end

@implementation SynthesizeExplorer
NSString *blaBlaName;
@synthesize name = blaBlaName;
@end

如果您查看 implementation,您会发现 属性 name 由名为 blaBlaName 的内部变量支持,而不是由典型的编译器生成的 ivar 支持name_name.

到今天为止,当您想使用自定义内部变量来支持您声明的 属性 时,我看到使用 @synthesize 的唯一原因。否则我看不出写 @synthesize propertyname;@synthesize propertyname = _propertyname;

有任何意义