使用场景
我们可能需要在程序运行过程中使用一个变量,或者是没有必要创建一个全局变量。这个时候就可以用runtime的关联。
/**
* 用关联策略和定义的key设置两个对象之间的关联
*
* @param object 源对象(即被关联的对象).
* @param key 关联的关键字.
* @param value 关联的对象,当设置为nil的时候即为切断关联.
* @param policy 关联策略.
*
* @see objc_setAssociatedObject
* @see objc_removeAssociatedObjects(断开所有关联)
*/
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
/**
* 用关键字取得关联对象的值.
*
* @param object 源对象.
* @param key 关键字.
*
* @return 关联对象的值.
*
* @see objc_setAssociatedObject
*/
id objc_getAssociatedObject(id object, const void *key)
使用场景举例
- 场景一
alert和button关联:点击button弹出alert,在alert的代理方法中拿到改button对象。(代码回头补充)
- 场景二
给catagory增加属性。(代码回头补充)
PS:这里补充一下为什么catagory不能增加属性。我们先看一下类(Class)的定义:(Class本质其实是一个objc_class类型的指针)
![]()
可以看出类中的属性是存储在如上图红色部分的objc_ivar_list类型的struct容器里,而类中的方法是存储在如上图蓝色部分的objc_method_list类型的指针指向的容器里。也就是说类中要存储所有的属性,而只需要存储存放方法的容器地址。因为编译时每个类都被分配了固定的内存空间大小,如果增加属性就意味着要为其分配空间,因此不能在运行时随意增加属性。