注:本文旨在记录笔者的学习过程,仅代表笔者个人的理解,如果有表述不准确的地方,欢迎各位指正!因为涉及到的概念来源自网络,所以如有侵权,也望告知!
前言
本文主要通过实际案例了解isa走向及类内部的结构。
正文
类结构探索
创建一个继承自NSObject的LGPerson类。
@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.获取类对象存储的属性信息,可以看到我们之前定义的两个属性nickName和name
d.获取类对象储存的方法信息,这里会发现类里面只能拿到我们之前定义的实例方法- (void)sayHello;
e.在类对象中并没有找到我们定义的类方法,其实类方法+ (void)sayGoodbye;是存储在元类中
结论:属性和实例方法是存储在类对象中的,类方法是存储在元类中的。