iOS底层探索:isa走向及类结构探索

427 阅读1分钟

注:本文旨在记录笔者的学习过程,仅代表笔者个人的理解,如果有表述不准确的地方,欢迎各位指正!因为涉及到的概念来源自网络,所以如有侵权,也望告知!

前言

本文主要通过实际案例了解isa走向及类内部的结构。

正文

类结构探索

创建一个继承自NSObjectLGPerson类。

@interface LGPerson: NSObject

@property (nonatomic, copy) NSString *nickName;
@property (nonatomic, strong) NSString *name;

- (void)sayHello;
+ (void)sayGoodbye;

@end

@implementation LGPerson

- (void)sayHello {
    NSLog(@"hello");
}

+ (void)sayGoodbye {
    NSLog(@"Goodbye");
}

@end

1、isa走位探索

打断点调试,

通过lldb进行分析:

a.实例对象的isa指向对应的类

b.类的isa指向对应的元类

c.元类的isa指向根元类

d.根元类的isa指向自己

结论:通过lldb调试我们验证了isa的经典走位图

2、类内容探索

同样,通过lldb进行分析:

a.通过指针偏移32位获取类对象的bits信息

b.获取bits中的data()信息

c.获取类对象存储的属性信息,可以看到我们之前定义的两个属性nickNamename

d.获取类对象储存的方法信息,这里会发现类里面只能拿到我们之前定义的实例方法- (void)sayHello;

e.在类对象中并没有找到我们定义的类方法,其实类方法+ (void)sayGoodbye;是存储在元类中

结论:属性和实例方法是存储在类对象中的,类方法是存储在元类中的。