RSA指针。

rsa指针

最近在面试的过程中。总是一直在问一些关于ios开发底层的一些东西。从今天开始将系统的理解分析一下。

isa 指针

Objective-C 是一门面向对象的编程语言,每一个对象都是一个类的实例。在 Objective-C 语 言的内部,每一个对象都有一个名为 isa 的指针,指向该对象的类。每一个类描述了一系列 它的实例的特点,包括成员变量的列表、成员函数的列表等。每一个对象都可以接收消息, 而对象能够接收的消息列表保存在它所对应的类中。
在 Xcode 中按 Shift+Cmd+O, 然后输入“NSObject.h”和“objc.h”,可以打开 NSObject 的定义 头文件,通过头文件我们可以看到,NSObject 就是一个包含 isa 指针的结构体,
RSA指针。
RSA指针。
RSA指针。
可以打开 Class 的定义头文件,通过头文 件我们可以看到,Class 也是一个包含 isa 指针的结构体,如下图所示(图中除了 isa 外还有 其他成员变量.

因为类也是一个对象,所以它也必须是另一个类的实列,这个类就是元类(metaclass)。元 类保存了类方法的列表。当一个类方法被调用时,元类会首先查找它本身是否有该类方法 的实现,如果没有,则该元类会向它的父类查找该方法,这样可以一直找到继承链的头。
元类也是一个对象,那么元类的 isa 指针又指向哪里呢?为了设计上的完整,所有的元类的 isa 指针都会指向一个根元类(root metaclass)。根元类本身的 isa 指针指向自己,这样就形成 了一个闭环。上面提到,一个对象能够接收的消息列表是保存在它所对应的类中的。在实际 编程中,我们几乎不会遇到向元类发消息的情况,那它的 isa 指针在实际上很少用到。不过 这么设计保证了面向对象的干净,即所有事物都是对象,都有 isa 指针。
我们再来看看继承关系,由于类方法的定义是保存在元类中,而方法调用的规则是,如果该 类没有一个方法的实现,则向它的父类继续查找。所以,为了保证父类的类方法可以在子类 中可以被调用,所有子类的元类会继承父类的元类,换而言之,类对象和元类对象有着同样 的继承关系。RSA指针。