@property专题

“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。

Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。有了这种严格的命名规范,所以 Objective-C才能根据名称自动创建出存取方法。其实也可以把属性当做一种关键字,其表示:编译器会自动写出一套存取方法,用以访问给定类型中具有给定名称的变量。 所以你也可以这么说: 
@property = getter + setter;

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的一些属性,定义如下:

typedef struct { const char *name; const char *value; } objc_property_attribute_t;

而attributes的具体内容是什么呢?其实,包括:类型,原子性,内存语义和对应的实例变量。

定义一个string的property@property (nonatomic, copy) NSString *string;,

通过 property_getAttributes(property)获取到attributes并打印出来之后的结果为T@”NSString”,C,N,V_string

其中T就代表类型,C就代表Copy,N代表nonatomic,V就代表对于的实例变量。

完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis)。

除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。

反编译过相关的代码,发现大致生成了五个东西

OBJC_IVAR_属性名称 :该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表示该变量距离存放对象的内存区域的起始地址有多远。 
setter 与 getter 方法对应的实现函数 
ivar_list :成员变量列表 
method_list :方法列表 
prop_list :属性列表

有两个特定指令:

sythesize:自动生成setter和getter方法,且可指定名称的成员变量

dynamic: 需手动生成setter和getter方法,

copy描述根据下面的来理解即可:

对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。copy后的为不可变对象

  • [immutableObject copy] // 浅复制

  • [immutableObject mutableCopy] //深复制

  • [mutableObject copy] //深复制

  • [mutableObject mutableCopy] //深复制

猜你喜欢

转载自www.cnblogs.com/diyigechengxu/p/9202785.html
今日推荐