美文网首页Mac·iOS开发
RunTime源码阅读(九)之isa指针,类,元类

RunTime源码阅读(九)之isa指针,类,元类

作者: 某非著名程序员 | 来源:发表于2020-01-27 10:54 被阅读0次

在Object-c中,实例对象的isa指向类对象,类对象的isa指向元类对象。也就是说调用实例对象的方法会查找类中的方法,调用类对象方法会在查找元类中的方法。

Person * person = [[Person alloc] init];
[person instanceMethodSelf];//实例方法
[Person classMethodSelf];//类方法

RunTime源码阅读(六)之消息查找方法最终会调用lookUpImpOrForward。

实例方法中的cls已经是Person
在实例方法调用时,断点看到cls已经是Person类 类方法

类方法中的cls已经是一串地址了。而这串地址就是objc_getMetaClass("Person")打印的元类地址。


截屏2020-01-27上午10.39.40.png

至此证明了:实例方法是调用类中的方法,类方法调用的是元类的方法。

class_getInstanceMethod:获取实例方法

Method addMethod = class_getInstanceMethod(self, @selector(addDynamicInstanceMethodAfter));//方法的二分查找,self当前类对象

class_getInstanceMethod在静态方法中调用时,self就是当前类。关于证明可以参考这篇文章:iOS 实例方法和类方法中的self与self.class有什么区别?

class_getClassMethod:获取类方法

Method class_getClassMethod(Class cls, SEL sel)
{
    if (!cls  ||  !sel) return nil;
//getMeta对isa查找的封装,如果是元类返回self,如果是类则返回isa。与self.class查找有点像
    return class_getInstanceMethod(cls->getMeta(), sel);//cls->getMeta()不是类对象,是元类
}

class_getClassMethod:中调用是直接获取cls->getMeta()

总结:

  1. 无论是从方法调用,还是从获取类方法和实例方法。系统内部已经自动处理了isa指针,无需开发者处理。
  2. 为什么实例对象方法存在类对象,类对象方法存在元类中?
    个人理解:这只是一种实现的形式:实例对象方法是一直存在的,不可能随着变量的生命周期而产生和销毁。对象分配会增加和减少内存,但对象的方法属性是固定的。找个媒介存放而已。
    实例对象和类对象本质是一样的,都是方法。类对象的与实例对象相比,没有生命周期,只有静态方法而言,相当于是阉割版的实例方法。

相关文章

  • RunTime源码阅读(九)之isa指针,类,元类

    在Object-c中,实例对象的isa指向类对象,类对象的isa指向元类对象。也就是说调用实例对象的方法会查找类中...

  • iOS开发 Runtime 流程图

    你了解多少Runtime? isa 指针的理解 实例对象 isa 指向类对象 类对象指 isa 向元类对象 元类对...

  • iOS - Runtime基础

    Runtime合集iOS - isa、superclass指针,元类superclass指向基类本身[https:...

  • iOS开发中方法查找流程图

    实例对象的isa指针指向类对象,类对象的isa指针指向元类,元类的isa指针指向根元类,根元类的isa指针指向自己...

  • 类对象、元类

    任何实例的isa指针指向其类对象,类对象的isa指针指向其元类对象,元类对象的isa指针指向根元类对象,根元类对象...

  • iOS 对象和isa指针详解

    一个objc对象的isa指针指向他的类对象,类对象的isa指针指向他的元类,元类的isa指针指向根元类,所有的元类...

  • 1.8、iOS面试题之语法

    1、isa指针?(对象的isa,类对象的isa,元类的isa都要说) 对象的isa指针指向所属的类 类的isa指针...

  • isa指针?(对象的isa,类对象的isa,元类的isa都要说)

    对象的isa指针指向所属的类类的isa指针指向了所属的元类元类的isa指向了根元类,根元类指向了自己。 类的sup...

  • 探究isa指针本质

    和之前一样,也是从源码中找到答案。我们都知道,实例对象的isa指针指向类对象,类对象的isa指针指向元类对象。 1...

  • Runtime 与 Aspects

    Runtime 之 isa指针 1.横向看:实例是对象,类也是对象(类对象),meta类也是对象(原类对象)这是很...

网友评论

    本文标题:RunTime源码阅读(九)之isa指针,类,元类

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