美文网首页
iOS-底层原理(3)-isa和superclass

iOS-底层原理(3)-isa和superclass

作者: 路飞_Luck | 来源:发表于2018-08-25 20:40 被阅读57次

    1. isa 指针

    image.png
    • instanceisa指向class

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

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

    2.class对象的superclass指针

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

    3. meta-class对象的superclass指针

    image.png
    • 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
    isa、superclass总结
    关系图.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;
    }
    

    打印结果

    image.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;
    }
    

    输出结果

    image.png

    为啥呢?NSObject元类对象的superclass指向基类

    image.png

    isa -> superclass -> superclass -> superclass ...
    说明类方法最终都是走基类对象方法


    本文参考借鉴MJ的教程视频,非常感谢.


    项目地址 - Interview-isa-superclass

    相关文章

      网友评论

          本文标题:iOS-底层原理(3)-isa和superclass

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