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

1. isa 指针

iOS-底层原理(3)-isa和superclass_第1张图片
image.png
  • instanceisa指向class

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

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

2.class对象的superclass指针

iOS-底层原理(3)-isa和superclass_第2张图片
image.png
  • 当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用。

3. meta-class对象的superclass指针

iOS-底层原理(3)-isa和superclass_第3张图片
image.png
  • 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
isa、superclass总结
iOS-底层原理(3)-isa和superclass_第4张图片
关系图.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指向基类

iOS-底层原理(3)-isa和superclass_第5张图片
image.png

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


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


项目地址 - Interview-isa-superclass

你可能感兴趣的:(iOS-底层原理(3)-isa和superclass)