OC 底层原理笔记

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

2020-01-20  本文已影响0人  zysmoon

1. isa 指针

1653926-b510c30e2c92c5c5.png

2.class对象的superclass指针

1653926-7ee85da90d34f14f.png

3. meta-class对象的superclass指针

1653926-b510c30e2c92c5c5.png
isa、superclass总结
1653926-120b85207083df9c.png
1.isa指向
2.superclass指向
3.调用方法的轨迹
例子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

上一篇下一篇

猜你喜欢

热点阅读