美文网首页
为什么设计元类

为什么设计元类

作者: 改变1 | 来源:发表于2022-12-06 15:30 被阅读0次

如果从runtime的objc_msgSend角度出发,此种设计主要是为了复用消息机制,并提高消息发送效率。
oc在调用过程中,编译后实际上是使用了objc_msgSend进行消息发送。我们知道,实例方法(比如-(void)A号方法)属性等,存储位置在类中。同时我们每一次初始化alloc一个实例对象后,此实例对象也都会默认保存一个isa指针,指向类。我们在编写代码写的调用方法,在编译完成后都会使用runtime编译称此种形式

id objc_msgSend(id self, SEL op, ...)

这个函数有俩个隐式的参数:消息的接收者,消息的⽅法名。通过这俩个参数就能去找到对应⽅法的实现。所以如果正常情况下,编译期间只接调用就可以,因为isa指针和参数名称在【A对象 A】这种中括号发送小时时候都能拿到。这样看的话,对于实例对象来说并没有什么影响。

但是,问题来了,oc中类方法+号方法和实例方法-号方法是可以同名的。比如项目中可以同时存在+A方法和-A方法。如果此种方式的话,编译后的objc_msgSend要怎么处理????解决方法就是增加的新参数,标记是类方法还是实例方法。还需要一个参数标记接受消息的对象是实例对象还是类对象。

显然是不可能的,objc_msgSend方法作为oc这门语言的设计基础,消息发送效率肯定是越快越好。如果没有元类主动区分开,在运行时,在objc_msgSend这个重度使用方法逻辑中去做大量的其他区分,无疑是对运行效率的大量浪费。

所以元类的出现就解决了这个问题,让各类各司其职,实例对象就⼲存储属性值的事,类对象存储实例⽅法列表,元类对象存储类⽅法列表,符合设计原则中的单⼀职责,⽽且忽略了对对象类型的判断和⽅法类型的判断可以⼤⼤的提升消息发送的效率,并且在不同种类的⽅法⾛的都是同⼀套流程,在之后的维护上也⼤⼤节约了成本。

此外在objc底层没有类⽅法和实例⽅法的区别,都是函数。
我们可以通过runtime中提供的函数证明这一点


image.png

然后我们看下源码中class_getInstanceMethod的方法实现


3551670394594_.pic.jpg
从此处我们也可以看到,类方法在元类中的存储方式和实例方法在类中的存储方法,并无二致。针对于runtime获取方式来说,类方法和实例方法其实都是函数,只是保存的位置有所区别。

相关文章

  • 【平面设计教程】中国平面设计收费参考标准

    ​​一、品牌形象类 标志设计 3000元 - 10000元 不含基础系统设计,两套选一 VI视觉基础系统设计 50...

  • ios 底层-经典面试题

    1.元类中为什么会有类对象的类方法 探索中,我们知道实例方法存储在类中,类方法存储在元类中 为了探索我们面试题现象...

  • 3.isa

    isa指向 ->实例isa -> 类|类isa -> 元类 | 元类isa -> 根元类|根元类isa -> 根元...

  • iOS开发备战金三银四·来自网友的跳槽试水

    话不多说先看图 题目: 范围:gcd,tableview优化,设计模式,mvc的理解,类元类,数组字典底层,avf...

  • 面向对象特性------继承

    1,为什么要设计继承? 2,通过 " class A extends B " 类实现类的继承。 3,子类继承父类以...

  • 005-类结构探索(一)

    前言 前面我们分析了对象&类&元类的层次结构,以及他们之间的关系。显然,类模版cls是我们整个OC面向对象设计里面...

  • Flyweight 享元模式

    设计原则学习笔记 设计模式学习笔记 作用 提供可复用的对象。 类图 享元模式一般包含一个工厂,工厂中含有一个享元...

  • Python元类

    元类 元类就是用来创建类的,元类就是类的类。 实例 关于type()函数的使用戳这里 元类为一个函数 元类为一个类

  • 我的艺术专业适合韩国哪所学校?

    美术设计类:服装设计类、产品设计类、游戏设计类、视觉设计类、室内设计类、影像设计类、动画漫画类、东西洋画、陶艺雕塑...

  • c++ 友元函数总结

    友元函数介绍 为什么要使用友元函数 运算符重载的某些场合需要使用友元。(略) 两个类要共享数据:允许外面的类或函数...

网友评论

      本文标题:为什么设计元类

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