iOS - 知识梳理 (类探究、 isa)

OC比C多了面向对象,那么是如何做到的呢,今天大致了解一下类的构成。

首先要明确的一点是:oc当中类的定义也是对象,类和类的实例化对象 都是对象,所有对象都有isa指针。

typedef struct objc_class *Class;

oc的class 实质是objc_class的结构体,

再来看

isa:

一个Class类型的指针,每个实例对象的isa指针指向自己的类(Class),而Class(类)本身也是个对象,里面也有一个isa指针指向meteClass(元类),meteClass保存了类方法列表,同时meteClass也是一个对象,也有自己的isa指针 指向根元类(root meteClass),根元类的isa指向本身。

大概理解起来就是一个实例的创建需要一个模板,这个模板就是Class,然而这个模板是怎么制作出来的,他也需要自己的模板(meteClass),这里理解起来的时候一定要区别于superClass,这里不是父类的关系,差不多是模板的概念。

举个例子:有个A类,实例化对象 a,那么a的isa指针指向A,A里面的isa指向A的元类 meteA ,并不是指向A的父类,meteA里面保存了A的类方法,A里面保存了对象方法。meteA的isa指向根源类。(这里说这么多是因为很容易混淆,我之前就理解错了)

再往下只看字面意思就大概理解了,superClass:父类,ivars:成员变量,

methodLists:方法列表

在这里提一个问题,类方法(+方法), 对象方法(-方法)存储在哪里?

其实理解了类也是对象就很容易回答这个问题

首先实例化对象 上面举例中的a的方法是存在其类(A)里面的methodLists列表里。

那么A也是个实例对象 它的方法(也就是类方法)存储在A的元类里 meteA(这个名字是随便起的)的methodLists列表里面。

理解了类的本质,将来会比较有助于理解 KVC,KVO的实现原理,还有一些比较流行的第三方json-model映射的框架,以及一些runtime的方法。

猜你喜欢

转载自blog.csdn.net/evol_f/article/details/82781094
isa