isa走位分析
//定义LGTeacher类,声明对象teacher
LGTeacher *teacher = [LGTeacher alloc];
通过lldb控制台打印,如下图分析
从上图中我们可以得到:
- 对象的isa指针指向它所在的类
- 对象所在类的isa指针指向
元类 元类的isa指针指向根元类根元类的isa指针指向了自己
因此我们可以得出一个经典的 isa走位图与继承图
注意
- 实线表示继承关系,但对象没有继承关系,只有类以及元类有继承关系
- 虚线表示指向关系,比如对象的isa指针指向Subclass,Subclass的isa指针指向元类等
类对象只存在一份
OC中万物皆对象
从上面的isa走位分析中我们都知道无论对象,还是类,亦或者元类都有isa指针,这是为什么呢?其实这里就涉及到 _objc_class与 _objc_object两个结构体类型了。
先看_objc_object结构体
我们在OC源码中,搜索_objc_object,我们看下图所示我们可以看到
objc_object结构体中有 Class 声明的isa,这说明了 对象一定有isa(所有的对象都是以 objc_object为模板继承过来的)。
再看_objc_class
我们搜索 _objc_class,如下图所示我们惊讶发现
_objc_class结构体继承与objc_object,而objc_object我们上面分析了确认有isa,因此我们得到_objc_class一定有isa
总结
综上分析我们得
- 对象、类、元类等都有isa属性
- 对象、类、元类等都是继承
_objc_object过来的,它们都是对象,即OC中万物皆对象
类结构分析
我们在LGTeacher类中声明一个类方法、一个实例方法以及一个属性,并在.m中实现上述两个方法
@interface LGTeacher : LGPerson
@property (nonatomic, copy) NSString *name;
-(void)sayHello;
+(void)sayByby;
@end
我们使用lldb控制台打印输出
先分析方法列表methords()
为什么要偏移20位置呢?
我们继续探究
从上图中我们可以探究到
sayHelloc方法,但是 没有找到 sayByby方法的实现,为什么呢?这是因为:实例方法在存放在类中,类方法存在元类中,类方法的实现我们在下篇再来探讨。
再分析属性列表properties()
从上面图中我们得到了proerty属性信息。