美文网首页OC 底层原理笔记
3OC使用原理 - 3- isa和superclass

3OC使用原理 - 3- isa和superclass

作者: zysmoon | 来源:发表于2020-01-20 14:40 被阅读0次

    1. isa 指针

    1653926-b510c30e2c92c5c5.png
    • instanceisa指向class

      • 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
    • classisa指向meta-class

      • 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

    2.class对象的superclass指针

    1653926-7ee85da90d34f14f.png
    • 当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用。

    3. meta-class对象的superclass指针

    1653926-b510c30e2c92c5c5.png
    • 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
    isa、superclass总结
    1653926-120b85207083df9c.png
    1.isa指向
    • instance的isa指向class
    • class的isa指向meta-class
    • meta-class的isa指向基类的meta-class
    2.superclass指向
    • class的superclass指向父类的class,如果没有父类,superclass指针为nil
    • meta-class的superclass指向父类的meta-class
    • 基类的meta-class的superclass指向基类的class
    3.调用方法的轨迹
    • instance调用对象方法的轨迹

      • isa找到class,方法不存在,就通过superclass找父类
    • class调用类方法的轨迹

      • isa找meta-class,方法不存在,就通过superclass找父类
    例子1

    新建一个NSObject的分类

    @interface NSObject (Test)
    + (void)test;
    @end
    
    @implementation NSObject (Test)
    + (void)test {
        NSLog(@"+[NSObject test] - %p", self);
    }
    @end
    
    

    然后新建一个CSPerson类

    @interface CSPerson : NSObject
    + (void)test;
    @end
    
    @implementation CSPerson
    
    + (void)test {
        NSLog(@"+[CSPerson test] - %p", self);
    }
    
    

    开始调用

    #import "NSObject+Test.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSLog(@"[MJPerson class] - %p", [CSPerson class]);
            NSLog(@"[NSObject class] - %p", [NSObject class]);
    
            [CSPerson test];
            [NSObject test];
        }
        return 0;
    }
    
    

    打印结果

    1653926-dc35e785ce4ba17d.png
    例子2

    将NSObject的分类中类方法改成实例方法

    @implementation NSObject (Test)
    - (void)test {
        NSLog(@"-[NSObject test] - %p", self);
    }
    @end
    
    

    去掉CSPerson的test实现方法

    @interface CSPerson : NSObject
    + (void)test;
    @end
    
    @implementation CSPerson
    @end
    
    

    开始调用

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSLog(@"[CSPerson class] - %p", [CSPerson class]);
            NSLog(@"[NSObject class] - %p", [NSObject class]);
    
            [CSPerson test];
            [NSObject test];
        }
        return 0;
    }
    
    

    输出结果

    1653926-048296d6d746f111.png

    说明类方法最终都是走基类对象方法


    本文参考:
    路飞_Luck (https://www.jianshu.com/p/07f7b96bb03f)
    以及借鉴MJ的教程视频
    非常感谢.


    项目地址 - Interview-isa-superclass

    相关文章

      网友评论

        本文标题:3OC使用原理 - 3- isa和superclass

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