美文网首页
iOS原理篇:关联对象

iOS原理篇:关联对象

作者: 绍清_shao | 来源:发表于2020-03-25 14:49 被阅读0次

前言

Swift中不能再extension中为类添加存储属性,如何利用关联对象变相添加属性呢?

extension ViewController {
    struct AssociatedKeys {
        static var myTestKey: UInt8 = 0
    }
    
    // 计算属性
    var myTest: String? {
        
        get {
            guard let value = objc_getAssociatedObject(self,
                           &AssociatedKeys.myTestKey) as? String
                else { return nil }
            return value
        }
        
        set(newValue) {
            objc_setAssociatedObject(self,
                                     &AssociatedKeys.toggleState,
                                     newValue,
                                     .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        
    }
    
    
}

关联对象相关API

关联对象的底层原理

关联对象并不是存储在被关联对象本身的内存中,通过分析底层实现,它存储在由AssociationsManager管理的全局统一的一个AssociationsHashMap中,关系如下:

image

从上图可以看出,关联对象的底层实现依赖下面四个核心对象:

  • AssociationsManager
  • AssociationsHashMap
  • ObjectAssociationMap
  • ObjectionAssociation

它们之间的关系:AssociationsHashMap里存储着某个对象的关联对象Map表,即ObjectAssociationMap,这个表存储了多个关联对象,因为在分类里可以给对象添加多个属性,也就要设置多个关联对象,ObjectAssociationMap中就是我们添加的关联对象,比如name,由ObjectionAssociation存储值和策略,当我们将关联对象(即value值,本例中是person.name = nil)设为nil时,AssociationsMap自动删除这条关联对象;当我们调用objc_removeAssociatedObjects(id object)方法时,就是移除某个对象的所有关联对象,即上图中AssociationHashMap需要移除对象的关联对象Map表;

相关文章

  • iOS原理篇:关联对象

    前言 Swift中不能再extension中为类添加存储属性,如何利用关联对象变相添加属性呢? 关联对象相关API...

  • iOS关联对象技术原理

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

  • iOS原理篇(四):关联对象

    关联对象的使用场合 关联对象的基本使用 关联对象的底层原理 一、关联对象的使用场合默认情况下,因为分类底层结构的限...

  • iOS底层原理总结 - 关联对象实现原理

    iOS底层原理总结 - 关联对象实现原理 iOS底层原理总结 - 关联对象实现原理

  • IOS基础知识-关联对象原理篇

    Category能否添加成员变量?如果可以,如何给Category添加成员变量?答:不能直接添加成员变量,但是可以...

  • iOS Objective-C 关联对象

    iOS Objective-C 关联对象 1. 关联对象简介 对于关联对象,我们熟悉它的地方就是给分类添加属性。虽...

  • iOS对象关联

    什么是关联对象 关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上。 举个例子:xiaoming是P...

  • iOS:关联对象

    目录一,添加属性二,基本知识三,底层原理四,注意点 一,添加属性 1,在类中添加属性,系统会自动生成带下划线的成员...

  • iOS 关联对象

    在平时的工作中经常碰到给类别添加属性的操作,那么实现思路是怎么样的呢? 代码实现:新建一个Person类和Pers...

  • iOS 关联对象

    可以不改变源码的情况下增加实例变量。可与分类配合使用,为分类增加属性。(类别是不能添加成员变量的(property...

网友评论

      本文标题:iOS原理篇:关联对象

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