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;
编译器自动生成并使用一个名为 propertyname
的 iVar
并在其默认访问器实现中使用它,你也可以将它用作 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
都很方便,因为它可以让我们免于编写样板代码,例如为声明的属性添加 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;
有任何意义
我是 objective c 的新手。我在 class 的 .h 头文件中创建了一个 属性 然后我合成了。
有什么区别
@synthesize propertyname;
和
@synthesize propertyname = _propertyname;
两者都有效,但使用第一个或第二个的目的是什么。
感谢任何帮助。
首先你不用再写@synthesize propertyname
了
在 Objective-C 中,当您声明一个 属性 时,默认情况下编译器会自动为您生成访问器方法。这些访问器方法可以是 getter 和 setter 如果 属性 是可读写的 属性 否则只是 getter 如果它是只读的 属性。
编译器在这些访问器方法实现的幕后使用内部变量(称为 iVar)。 (显然,您可以提供自己对这些访问器方法的实现,也可以提供自己的内部变量)
@synthesize propertyname;
和@synthesize propertyname = _propertyname;
当你声明一个 @synthesize propertyname;
编译器自动生成并使用一个名为 propertyname
的 iVar
并在其默认访问器实现中使用它,你也可以将它用作 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
都很方便,因为它可以让我们免于编写样板代码,例如为声明的属性添加 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;