当前位置: 移动技术网 > IT编程>移动开发>IOS > 【OC底层】AssociatedObject 关联对象

【OC底层】AssociatedObject 关联对象

2018年11月30日  | 移动技术网IT编程  | 我要评论

杜集区政府网,安徽医生被砍死,小型摇床

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

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

#import "xgperson.h"

// 分类属性是不会生成 get\set 方法的,如果不重写这两个方法,就无法正常使用属性
@interface xgperson (test)

@property (nonatomic,assign) int age;

@end
#import "xgperson+test.h"
#import <objc/runtime.h>

@implementation xgperson (test)


- (void)setage:(int)age{
    
    // @selector(age) 这个参数只要传一个地址指针就可以
    objc_setassociatedobject(self, @selector(age), @(age), objc_association_assign);
}

- (int)age{
    
    // 隐式参数
    // _cmd = @selectior(age)
    return [objc_getassociatedobject(self, _cmd) intvalue];
}

调用:

        xgperson* p1 = [[xgperson alloc]init];
        p1.name = @"p1";
        p1.age = 18;
        
        xgperson* p2 = [[xgperson alloc]init];
        p2.name = @"p2";
        p2.age = 20;
        
        nslog(@"p1name:%@  p1age:%i----p2name:%@  p2age:%i",p1.name,p1.age,p2.name,p2.age);

输出:

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,就相当于是移除关联对象

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网