runtime之关联引用

来源:互联网 发布:近视眼手术知乎 编辑:程序博客网 时间:2024/05/16 16:20

使用场景

我们可能需要在程序运行过程中使用一个变量,或者是没有必要创建一个全局变量。这个时候就可以用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类型的指针)
Class
可以看出类中的属性是存储在如上图红色部分的objc_ivar_list类型的struct容器里,而类中的方法是存储在如上图蓝色部分的objc_method_list类型的指针指向的容器里。也就是说类中要存储所有的属性,而只需要存储存放方法的容器地址。因为编译时每个类都被分配了固定的内存空间大小,如果增加属性就意味着要为其分配空间,因此不能在运行时随意增加属性。

0 0