synthesize propertyname = _propertyname有什么区别?



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

@synthesize propertyname;

@synthesize propertyname = _propertyname;

两者都可以,但是使用第一个或第二个的目的是什么呢?

感谢您的帮助。

首先你不需要再写@synthesize propertyname

在Objective-C中,当你声明一个属性时,编译器默认会自动为你生成它的访问方法。如果property既是读写属性,则可以是getter和setter;如果property是只读属性,则只能是getter。

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

@synthesize propertyname;@synthesize propertyname = _propertyname;的区别是什么

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

property = @"abcd";

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

_property = @"abcd";

一般来说,这两个语句之间的区别只是iVar的名称不同(尽管它的用法不同)

使用第一个或第二个的目的是什么

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

当我们对ivar的名称没有任何特定的保留,也不想为特定的属性提供我们自己的私有变量ivar时,我们过去写@synthesize propertyname;(下面详细解释)。这比显式指定iVar的名称简单,并且我们知道编译器会为我们生成一个与属性同名的ivar

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

在这两种情况下,@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;有什么意义

最新更新