源代码copy
不废话,直接附上实现的源代码:
相关API声明在objc-runtime.mm中
1. 设置相关对象的值
|
|
从代码中可以看出,所有的相关对象信息实际上是保存在全局的一个哈希表中。其中,以实例对象的地址( DISGUISE(object) )为键名,对应的值为另一张哈希表。此子哈希表中,以设置的属性名为键名,对应的值为相关值value和内存管理方式policy组成的结构体实例。
而保存相关对象的值的操作中,系统:
- 首先查看是否已经存储过此object对应的子哈希表,不存在则创建;
- 查看子哈希表中,是否已经存储过此属性名key对应的结构体信息,存在即修改为新值,不存在则创建新的保存;
- 对与传入的value为nil时,清除子哈希表中属性名key对应的结构体信息,以达到清除相关值的目的(系统没有提供单独清空相关值属性的API )。
- 替换下来的相关值信息,抹掉并释放内存。
2. 获取相关对象的值
|
|
3. 为实例对象清除所有的相关对象
|
|
相关问题
1. 在Category中添加的property属性,系统为什么不会自动合成setter和getter?
- 在编译期,类的内存布局已经确定,在Class的结构中,并没有专门存储Category相关信息的位置。
- Category是在APP启动时,在运行期才进行加载的,且是在对应的类加载完毕后才进行。最重要的,加载Category时,系统只是将内部声明的方法附加到Class的对应方法列表中,并不会对类的ivar列表进行操作。
- 最重要的,objc_category_t结构体中,根本没有变量成员,故自身也不能存储任何变量的值。
2. 相关对象是针对类的还是实例对象的?
显而易见,由API的实现,可以看到,所有的相关对象是与object参数,即类的实例对象进行绑定关联,并存储到全局哈希表中的。故设置的相关对象只对当前的调用者对象有效。