runtime理解
rutime
runtime:运行时,是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数
1.常用的头文件 #import <objc/runtime.h> 包含对类、成员变量、属性、方法的操作 #import <objc/message.h> 包含消息机制 2.常用方法 class_copyIvarList()返回一个指向类的成员变量数组的指针 class_copyPropertyList()返回一个指向类的属性数组的指针
10、关联
使用关联,我们可以不用修改类的定义而为其对象增加存储空间。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。(避免被释放掉)
用objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略
关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。(比如static char number 不用赋值,关键字为number的地址, )
关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用 预先定义好的常量来表示的。
设置关联:objc_setAssociatedObject(关联对象, &关键字, 被关联对象, OBJC_ASSOCIATION_RETAIN);
获取关联对象: NSString * associatedObject = (NSString *)objc_getAssociatedObject(关联对象, &关键字); //假如关键字是字符串类型
断开关联关系:objc_setAssociatedObject(关联对象, &关键字, nil, OBJC_ASSOCIATION_RETAIN);//被关联对象传nil即可
使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。