iOS底层原理之isa走位与类结构分析

290 阅读2分钟

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属性信息。