经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
【OC底层】AssociatedObject 关联对象
来源:cnblogs  作者:这酸爽!  时间:2018/11/30 9:30:07  对本文有异议

如何实现给分类“添加成员变量”?

  • 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现
  • 关联对象提供了以下API

  1> 添加关联对象

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

  2> 获得关联对象

  id objc_getAssociatedObject(id object, const void * key)

  3> 移除所有的关联对象

  void objc_removeAssociatedObjects(id object)

 

key的常见用法

 

objc_AssociationPolicy修饰符

 

 

给分类添加属性实例

假如已经有一个 XGPerson的类,现在我们需要扩展这个类,并且添加一个 age 属性

  1. #import "XGPerson.h"
  2.  
  3. // 分类属性是不会生成 get\set 方法的,如果不重写这两个方法,就无法正常使用属性
  4. @interface XGPerson (Test)
  5. @property (nonatomic,assign) int age;
  6. @end
  1. #import "XGPerson+Test.h"
  2. #import <objc/runtime.h>
  3.  
  4. @implementation XGPerson (Test)
  5. - (void)setAge:(int)age{
  6. // @selector(age) 这个参数只要传一个地址指针就可以
  7. objc_setAssociatedObject(self, @selector(age), @(age), OBJC_ASSOCIATION_ASSIGN);
  8. }
  9. - (int)age{
  10. // 隐式参数
  11. // _cmd = @selectior(age)
  12. return [objc_getAssociatedObject(self, _cmd) intValue];
  13. }

调用:

  1. XGPerson* p1 = [[XGPerson alloc]init];
  2. p1.name = @"p1";
  3. p1.age = 18;
  4. XGPerson* p2 = [[XGPerson alloc]init];
  5. p2.name = @"p2";
  6. p2.age = 20;
  7. NSLog(@"p1Name:%@ p1Age:%i----p2Name:%@ p2Age:%i",p1.name,p1.age,p2.name,p2.age);

输出:

  1. 2018-11-29 14:20:38.666084+0800 关联对象(增加分类属性)[1923:87124] p1Name:p1 p1Age:18----p2Name:p2 p2Age:20

 

关联对象的原理

  • 实现关联对象技术的核心对象有

  AssociationsManager
  AssociationsHashMap
  ObjectAssociationMap
  ObjcAssociation

  •  objc4源码解读:objc-references.mm

   

  • 关联对象存储结构图

  1. 关联对象并不是存储在被关联对象本身内存中
  2. 关联对象存储在全局的统一的一个AssociationsManager中
  3. 设置关联对象为nil,就相当于是移除关联对象

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号