【发布时间】:2021-12-01 15:32:03
【问题描述】:
我是目标 c 的新手。我在类的 .h 头文件中创建一个属性,然后进行合成。
有什么区别
@synthesize propertyname;
和
@synthesize propertyname = _propertyname;
两者都有效,但使用第一个或第二个的目的是什么。
任何帮助表示赞赏。
【问题讨论】:
标签: ios objective-c
我是目标 c 的新手。我在类的 .h 头文件中创建一个属性,然后进行合成。
有什么区别
@synthesize propertyname;
和
@synthesize propertyname = _propertyname;
两者都有效,但使用第一个或第二个的目的是什么。
任何帮助表示赞赏。
【问题讨论】:
标签: ios objective-c
首先你不用写@synthesize propertyname了。
在 Objective-C 中,当你声明一个属性时,编译器默认会自动为你生成它的访问器方法。这些访问器方法可以是 getter 和 setter,如果属性是 read 和 write 属性,否则只是 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 遵循特定的命名法(属性名称后为“_”)时,或者当我们想要使用我们自己的私有变量时,我们通常会写@synthesize propertyname = _propetyname iVar 到一个属性。
在这两种情况下,@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;有任何意义
【讨论】: