美文网首页
07.Objective-C 关联对象

07.Objective-C 关联对象

作者: ProfessorFan | 来源:发表于2021-02-07 17:15 被阅读0次

问题

  1. 分类中可以添加属性吗?
  2. 整么才能使分类中的属性,像正常类的属性一样使用?
  3. 关联对象的本质

答案

  1. 分类中可以添加属性吗?
    答案是肯定得分类中肯定可以添加属性,只是在分类中添加属性,不会向正常类中添加属性一样,自动生成实例变量,还有setter,get 方法
struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;
    const struct _method_list_t *class_methods;
    const struct _protocol_list_t *protocols;
    const struct _prop_list_t *properties;  # 这个就是分类的结构,里面存在属性这个list
};
  1. 整么才能使分类中的属性,像正常类的属性一样使用?
    但是是关联对象,可以使分类中有向类一样的正常属性
    具体代码如下:

#  这个是分类的 interface 
@interface FanPerson(Test)

@property (copy, nonatomic) NSString *name;

@end

# 这个是分类的implement

@implement FanPerson(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);
}

@end
  1. 关联对象的本质
  • 关联对象涉及到的核心对象有:
    AssociationsManager,AssociationsHashMap,ObjectAssociationMap,ObjecAssociation 这四个对象

关键类的在objc 源码中的定义:

class AssociationsManager {
    using Storage = ExplicitInitDenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap>;
    static Storage _mapStorage;

public:
    AssociationsManager()   { AssociationsManagerLock.lock(); }
    ~AssociationsManager()  { AssociationsManagerLock.unlock(); }

    AssociationsHashMap &get() {
        return _mapStorage.get();
    }

    static void init() {
        _mapStorage.init();
    }
};

typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap;
typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMap;

class ObjcAssociation {
    uintptr_t _policy;
    id _value;
}
  • 关联对象原理图


    IOS关联对象原理图.png

相关文章

  • 07.Objective-C 关联对象

    问题 分类中可以添加属性吗? 整么才能使分类中的属性,像正常类的属性一样使用? 关联对象的本质 答案 分类中可以添...

  • Swift 为分类增加属性objc_getAssociated

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

  • iOS runtime关联对象 objc_setAssociat

    关联对象的作用: 关联对象可以给某个对象关联一个或者多个其他对象,这些对象通过健来区分。 创建存储关联对象objc...

  • 关联对象

    关联对象的方式 关联对象源码基本思路 关联对象的结构:AssociationsHashManager // Ass...

  • 关联对象

    关联对象原理 关联对象并不是存储在被关联对象本身内存中,关联对象存储在全局的统一的一个AssociationsMa...

  • iOS 关联对象

    概述 关联对象顾名思义,就是给对象关联对象的意思,一个对象可以关联多个其他对象,这些对象通过key来区分,存储对象...

  • 关联对象

    关联对象会用被关联对象作为key,将关联对象存储到全局的哈希表里。 AssociationHashMap Asso...

  • iOS关联对象技术原理

    iOS关联对象技术原理 iOS关联对象技术原理

  • 关联对象

    分类里面添加成员变量, 分类里面是不能直接添加成员变量的,但是可以通过runtime间接添加成员变量。 为什么...

  • 关联对象

    能否为分类添加 “成员变量” ? 为分类所添加的成员变量添加在哪里? 所有对象的关联内容都在同一个全局容器内关联对...

网友评论

      本文标题:07.Objective-C 关联对象

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