关联对象

关联对象,第1张

associatedObject又称关联对象。顾名思义,就是把一个对象关联到另外一个对象身上。使两者能够产生联系。

这样我们就可以通过associatedObject在运行时给cagetory添加getter和setter。因为category中添加的property不会生成带下划线"_"的成员变量以及getter和setter的实现。所以可以通过关联对象实现getter和setter。

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

参数一:id object : 给哪个对象添加属性,这里要给自己添加属性,用self。

参数二:void * == id key : key值,根据key获取关联对象的属性的值,在objc_getAssociatedObject中通过次key获得属性的值并返回。

参数三:id value : 关联的值,也就是set方法传入的值给属性去保存。

参数四:objc_AssociationPolicy policy: 策略,属性以什么形式保存。

objc_getAssociatedObject(id object, const void *key)

参数一:id object : 获取哪个对象里面的关联的属性。

参数二:void * == id key : 什么属性,与objc_setAssociatedObject中的key相对应,即通过key值取出value。

总结:

关联对象并不存储在被关联对象本身内存中,而是有一个全局统一的 AssociationsManager中

一个实例对象就对应一个ObjectAssociationMap,

而ObjectAssociationMap中存储着多个此实例对象的关联对象的key以及ObjcAssociation,

ObjcAssociation中存储着关联对象的value和policy策略

首先获取input标签

var newInput=document.getElementByTagName("input")[0]

其次增加id属性值

newInput.id="para5"

日常开发过程中我们经常碰到要给分类添加自定义属性和变量的,下面通过关联对象给分类添加属性,也是runtime的实际应用之一,非常实用。(关于runtime的使用还有很多,这里只简单记录一下利用runtime给分类添加属性)。

关联Runtime提供了下面几个接口:

void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)

id objc_getAssociatedObject(id object, const void * key)

void objc_removeAssociatedObjects(id object)

id object被关联的对象

const void * key:关联的key,要求唯一

id value:关联的对象

objc_AssociationPolicy policy:内存管理策略

1.给UILabel添加一个 竖直方向的verticalText,如下图所示:

新建一个继承UILabel的Category,并添加一个成员变量

.h文件

m.文件

调用时就直接使用点语法:

_textLabel.verticalText = @"厉害了,我的国"

2.给UIButton添加一个扩大点击区域的实例方法

新建一个继承UIButton的Category,并添加一个实例方法

.h文件

.m文件

创建button并调用:

[button setTouchExpandEdgeWithTop:30 right:30 bottom:30 left:30]

点击button的上下左右各30pt,button也会有响应。

Demo链接


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11816113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存