美文网首页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