我是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;
编译器自动生成并使用一个名为propertyname
的iVar
,并在其默认访问器实现中使用它时,你也可以在你的.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
都很方便,因为它可以使我们不必编写像为声明的属性添加setter
和getter
方法这样的锅炉板代码。
如何使用自定义变量作为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;
有什么意义