美文网首页
isa和superClass

isa和superClass

作者: 化二缺 | 来源:发表于2020-04-29 09:36 被阅读0次

    isa

    各种对象的组成.png
    • 对象的isa指针是指向哪里的?
    • instance的 isa 指向 class
    • 当调用对象方法时,通过instance的isa找到class ,最后找到对象方法的实现进行调用
    • class的isa 指向 meta-class
    • 当调用类方法时,通过class的isa 找到meta-class 最后找到类方法发实现进行调用

    superClass

    • 先从对象的isa 找到 对象的class 然后通过 superClass指针指向父类的class然后 找到父类方法执行

    meta-class 对象的superClass指针

    image.png

    调用父类的类方法 是上图流程

    总结

    runtime关系图.png
    • instance 的 isa 指向class
    • class的 isa 指向 meta-class
    • meta-class的 isa 指向基类的 meta-class
    • class的superclass指向父类的class
    • 如果没有父类,superclass指针为nil
    • meta-class 的superclass指向父类的meta-class
    • 基类的meta-class的superclass指向基类的class

    instance调用对象方法的轨迹
    isa找到Class ,方法存在 就通过superClass找父类

    class 调用类方法的轨迹
    isa找到meta-class,方法不存在,就是通过superClass找父类
    值得注意的是基类的meta-class的superclass指针指向基类的class对象

    swift 用类方法的方式调用父类的对象方法不能调用成功

    extension NSObject {
        func textforlog6(){
               print("NSObject - 对象方法")
           }
    }
    class textVCRoot :NSObject {
        func textforlog(){
            print("textVCRoot - 对象方法")
        }
        class func textforlog2(){
            print("textVCRoot - 类方法")
        }    
    class textVC : textVCRoot {
         
    }
    
      textVC.textforlog() 错误❌
      textVC. textforlog6() 错误❌
    //Instance member 'textforlog6' cannot be used on type 'textVC'; 
    

    OC 可以

    #import "NSObject+test.h"
    
    @implementation NSObject (test)
    -(void)test{
        NSLog(@"NSObject+test.h");
    }
    @end
    
    #import "IsaLearnVC.h"
    #import "NSObject+test.h"
    
    @interface subStudent : NSObject
    
    @end
    
    @implementation subStudent
    @end
    
    @interface IsaLearnVC ()
    
    @end
    
    @implementation IsaLearnVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [subStudent test];  //正确✔️
    }
    @end
    
    • 所以swift在isa和superClass指针方面和OC 稍有不同
    • OC 在底层调用的时候是不分类方法还是对象方法的,只是按照方法名去寻找 类似 objc_msgSend([subStudent class],@selector(test))
    //实例对象
    Person * person = [[Person alloc] init];
    //类对象
    Class personClass = [Person class];
    //元类对象
    Class personMetaClass = object_getClass(personClass);
    
    
    image.png image.png
    image.png

    superClass 指针 不需要进行位运算 直接能找到父类地址值

    objc_class 底层结构 objc2以前的就不要拿出来讲了烦

    image.png

    相关文章

      网友评论

          本文标题:isa和superClass

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