@property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
来源:互联网 发布:手机淘宝怎么清理缓存 编辑:程序博客网 时间:2024/04/30 17:09
@property 的本质是什么?
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。
Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。在正规的 Objective-C 编码风格中,存取方法有着严格的命名规范。 正因为有了这种严格的命名规范,所以 Objective-C才能根据名称自动创建出存取方法。其实也可以把属性当做一种关键字,其表示:编译器会自动写出一套存取方法,用以访问给定类型中具有给定名称的变量。 所以你也可以这么说:
@property = getter + setter;
例如下面这个类:
@interface Person : NSObject@property NSString *firstName;@property NSString *lastName;@end
上述代码写出来的类与下面这种写法等效:
@interface Person : NSObject- (NSString *)firstName;- (void)setFirstName:(NSString *)firstName;- (NSString *)lastName;- (void)setLastName:(NSString *)lastName;@end
在runtime中属性的介绍
property在runtime中定义如下
typedef struct objc_property *objc_property_t;
而且objc_property是一个结构体,包括name和attributes;定义如下
struct property_t{ const char *name; const char *attributes;}
而attributes本质是objc_property_attribute_t,定义了property的一些属性,定义如下:
/// Defines a property attributetypedef struct { const char *name; /**< The name of the attribute */ const char *value; /**< The value of the attribute (usually empty) */} objc_property_attribute_t;
而attributes的具体内容是什么呢?其实,包括:类型,原子性,内存语义和对应的实例变量。
例如:我们定义一个string的property@property (nonatomic, copy) NSString *string;,通过 property_getAttributes(property)获取到attributes并打印出来之后的结果为T@”NSString”,C,N,V_string
其中T就代表类型,可参阅Type Encodings,C就代表Copy,N代表nonatomic,V就代表对于的实例变量。
ivar、getter、setter 是如何生成并添加到这个类中的?
“自动合成”( autosynthesis)
完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis)。需要强调的是,这个过程由编译 器在编译期执行,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。在前例中,会生成两个实例变量,其名称分别为 _firstName 与 _lastName。也可以在类的实现代码里通过 @synthesize 语法来指定实例变量的名字.
@implementation Person@synthesize firstName = _myFirstName;@synthesize lastName = _myLastName;@end
反编译过相关的代码,发现大致生成了五个东西
OBJC_IVAR_
setter 与 getter 方法对应的实现函数
ivar_list :成员变量列表
method_list :方法列表
prop_list :属性列表
也就是说我们每次在增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在 method_list 中增加 setter 与 getter 方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出 setter 与 getter 方法对应的实现,在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.
- @property的本质是什么?ivar、getter、setter是如何生成并添加到这个类中的
- @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
- property属性的setter、getter方法
- 黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法
- 黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法
- setter,getter,@property,@synthesize
- 快速生成java中的setter和getter
- idea添加getter、setter方法的快捷键
- property中的getter=isXXXX 是什么东西
- myeclipse 生成getter setter 的位置
- lombok生成getter、setter的小陷阱
- 生成getter与setter的方法
- eclipse 自动生成getter setter的问题
- Objective-C类的setter方法getter方法如何写
- @property简化setter、getter方法
- property生成属性的时候,同时重写setter与getter方法,那么实例变量不自动生成
- java的setter、getter 以及python的@property函数
- Object-C @property使用指定的setter和getter
- Windows 10 IoT Serials 6
- C++ 学习4 泛型编程 面向对象
- 中学生的良好学习方法及习惯和学习境界
- Hello Word~
- mysql mysam与innodb区别
- @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
- register_chrdev()与unregister_chrdev()
- 用 SqlProfiler 跟踪超时的语句
- 有关燃料电池氢气储能量的计算
- 2017年伊始,你需要尝试的25个Android第三方库
- 放苹果问题
- opencv之CvMat,Mat和IplImage之间的转化和拷贝
- 普通table表格样式及代码大全(全)
- 初中生的学习方法和技巧