【问题标题】:What is the difference between synthesize propertyname = _propertynamesynthesize propertyname = _propertyname 有什么区别
【发布时间】:2021-12-01 15:32:03
【问题描述】:

我是目标 c 的新手。我在类的 .h 头文件中创建一个属性,然后进行合成。

有什么区别

@synthesize propertyname;

@synthesize propertyname = _propertyname;

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

任何帮助表示赞赏。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    首先你不用写@synthesize propertyname了。

    在 Objective-C 中,当你声明一个属性时,编译器默认会自动为你生成它的访问器方法。这些访问器方法可以是 getter 和 setter,如果属性是 read 和 write 属性,否则只是 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 遵循特定的命名法(属性名称后为“_”)时,或者当我们想要使用我们自己的私有变量时,我们通常会写@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;有任何意义

    【讨论】:

    • @stefanosn:这个答案有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2011-01-05
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2012-05-01
    相关资源
    最近更新 更多