美文网首页
OC关联对象

OC关联对象

作者: 再好一点点 | 来源:发表于2021-11-02 17:46 被阅读0次

分类实现原理、加载时机

一. 为什么使用关联对象

为什么需要使用runtime的关联对象?为什么不在分类中直接添加成员变量?

要弄明白这些问题就需要研究一下分类的具体数据结构。如图:

分类数据结构
由上图可知分类的数据结构中有实例方法列表、类方法列表、协议列表、属性列表。但是没有成员变量列表,所以从数据结构这一层就可以看出分类无法直接添加成员变量。
添加的属性会生成set方法get方法但是不会生成成员变量。

二. 关联对象示例

在一个分类里边实现关联对象示例如下:

这里有个小技巧,就是在使用runtime的关联对象api的时候那个key是一个指针,所以就有很多种写法,比如直接写一个字符串,但是字符串一旦有改动不容易发现,所以推荐使用get方法作为key

@interface Person (Test)
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) int weight;

@end


@implementation Person (Test)

- (void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name
{
    // 隐式参数
    // _cmd == @selector(name)
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setWeight:(int)weight
{
    objc_setAssociatedObject(self, @selector(weight), @(weight), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (int)weight
{
    // _cmd == @selector(weight)
    return [objc_getAssociatedObject(self, _cmd) intValue];
}

@end

三. 关联对象存储在哪里

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

AssociationsManager
AssociationsHashMap
ObjectAssociationMap
ObjcAssociation

objc4源码解读:objc-references.mm

数据结构
  1. 关联对象并不是存储在被关联对象本身内存中
  2. 关联对象存储在全局的统一的一个AssociationsManager中
数据存储结构

相关文章

  • Swift 为分类增加属性objc_getAssociated

    OC 获取关联对象 Swift 获取关联对象——错误的写法 Swift 获取关联对象——正确的写法 设置关联对象 ...

  • OC关联对象

    ,❓思考一下:分类中能否添加属性?能否添加成员变量?直接上代码验证一下:创建一个Person类和它的分类Perso...

  • OC 关联对象

    关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上. 举个栗子: mikey是Person类的一个实...

  • OC关联对象

    分类实现原理、加载时机[https://www.jianshu.com/p/7c830ce3c303] 一. 为什...

  • OC-关联对象

    分类(Category):是OC中的特有语法,它是表示一个指向分类的结构体指针。原则上它只能增加方法,不能增加成员...

  • 探寻OC关联对象

    简单应用 关联对象常用的API如下: 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联...

  • OC-关联对象

    类扩展和分类 category:类别、分类用来给类增加方法、属性、协议不能增加成员变量,在分类的结构体中并没有存储...

  • 四、isa 指针关联类

    主要内容:1.OC对象的本质2.isa 与 类的关联原理3.isa 与 类的关联验证 1.OC对象的本质 先了解编...

  • Runtime 之关联对象

    关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上。 关联对象的原理: Runtime提供的API:...

  • OC-关联对象AssociatedObject

    关联对象 前言 我们都知道ARC环境下, 在一个类中声明一个属性@property (nonatomic, ass...

网友评论

      本文标题:OC关联对象

      本文链接:https://www.haomeiwen.com/subject/gsxfzltx.html