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

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(@"[CSPerson 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

又因为Root class(class)是类对象,存放的是对象方法,所以最终调用的是对象方法。

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


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


项目地址 - Interview-isa-superclass

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,820评论 0 9
  • iOS底层原理总结 - 探寻OC对象的本质 对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索...
    xx_cc阅读 21,886评论 31 178
  • 前言:本文简述OC对象、isa和SuperClass,如有错误请留言指正。 Q:OC中对象分类 A:总共为三类:实...
    梦蕊dream阅读 9,559评论 6 16
  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的...
    有一种再见叫青春阅读 3,715评论 0 3
  • 忽然间,就觉得往下坠 越是热闹,越是寂静 树林的边界,雪已经下了三天三夜 所有的声音都是风声,风吹着,冷 很难解释...
    蒋菱阅读 1,371评论 1 1