美文网首页Objective-C
【iOS】类的本质与isa指针

【iOS】类的本质与isa指针

作者: Colleny_Z | 来源:发表于2017-08-26 12:36 被阅读47次
  • 类本身也是一个对象,是class类型的对象.
效果图1 效果图2

objc_class结构体的定义:

假设我们创建一个Person类:

创建p对象:Person * p = [Person new] ;

在创建一个对象p之前,在堆内存中就先存在了一个该类(Person)的类型对象(类对象),类对象在编绎时系统会为我们自动创建。
创建一个对象之后,在堆内存中会创建了一个p对象,该对象包含了一个isa指针的成员变量(第一个属性),isa指针则指向在堆里面存在的类对象, 在栈内存里创建了一个该类的指针p,p指针指向的是isa地址,isa指向Person.

图1所示,Class是一个指向objc_class(类)结构体的指针,而id是一个指向objc_object(对象)结构体的指针。objec_object(对象)中isa指针指向的类结构称为objec_class(该对象的类),其中存放着普通成员变量与对象方法 (“-”开头的方法)。objec_class(类)中isa指针指向的类结构称为metaclass(该类的元类),其中存放着static类型的成员变量与static类型的方法 (“+”开头的方法)。

类对象(class object)

  • 类对象的实质由编译器创建的,即在编译时所谓的类,就是指类对象(官方文档中是这样说的: The class object is the compiled version of the class)。任何直接或间接继承了NSObject的类,它的实例对象(instance objec)中都有一个isa指针,指向它的类对象(class object)。这个类对象(class object)中存储了关于这个实例对象(instace object)所属的类的定义的一切:包括变量,方法,遵守的协议等等。因此,类对象能访问所有关于这个类的信息,利用这些信息可以产生一个新的实例,但是类对象不能访问任何实例对象的内容。当你调用一个 “类方法” 例如 [NSObject alloc],你事实上是发送了一个消息给他的类对象。
  • 类对象和实例对象是有很大区别的,尽管类对象保留了一个类实例的原型,但它并不是实例本身。它没有自己的实例变量,也不能执行类的实例的方法(只有实例对象才可以执行实例方法)。另外实例(-号)方法在类对象中,类对象从父类那里继承类方法,就像实例从父类那里继承实例方法一样。
  • 类对象是一个功能完整的对象,所以也能被动态识别(dynamically typed),接收消息,从其他类继承方法。特殊之处在于它们是由编译器创建的,缺少它们自己的数据结构(实例变量),只是在运行时产生实例的代理。

元类对象(metaclass object)

  • 元类对象的实质:类对象是元类对象的一个实例!!元类描述了 一个类对象,就像类对象描述了普通对象一样。不同的是元类的方法列表是类方法的集合,由类对象的选择器来响应。当向一个类发送消息时,objc_msgSend会通过类对象的isa指针定位到元类,并检查元类的方法列表(包括父类)来决定调用哪个方法。元类代替了类对象描述了类方法,就像类对象代替了实例对象描述了实例化方法。
    很显然,元类也是对象,也应该是其他类的实例,实际上元类是根元类(root class’s metaclass)的实例,而根元类是其自身的实例,即根元类的isa指针指向自身。
    类的super_class指向其父类,而元类的super_class则指向父类的元类。元类的super class链与类的super class链平行,所以类方法的继承与实例方法的继承也是并行的。而根元类(root class’s metaclass)的super_class指向根类(root class),这样,整个指针链就链接起来了!!

这里的,类对象是元类对象的一个实例,元类也是对象,也应该是其他类的实例

用官方的图标简单的标识就是如下:

Paste_Image.png

如有错误,希望一起探讨交流!

相关文章

  • 【iOS】类的本质与isa指针

    类本身也是一个对象,是class类型的对象. objc_class结构体的定义: 假设我们创建一个Person类:...

  • Objective-c isa、superclass指针深究,元

     研究iOS isa指针本质需要要了解类的本质和结构,我们都知道iOS的对象基本都是基于NSObject的子类。我...

  • OC中类的本质

    OC中的对象的本质 对象本身是一个含有isa指针的结构体,isa指针指向对象所属的类类的本质:类本质也是一个结构体...

  • 1.8、iOS面试题之语法

    1、isa指针?(对象的isa,类对象的isa,元类的isa都要说) 对象的isa指针指向所属的类 类的isa指针...

  • iOS开发中方法查找流程图

    实例对象的isa指针指向类对象,类对象的isa指针指向元类,元类的isa指针指向根元类,根元类的isa指针指向自己...

  • iOS - Runtime基础

    Runtime合集iOS - isa、superclass指针,元类superclass指向基类本身[https:...

  • ISA指向、类结构

    ISA指向、类结构 1.ISA指向 上次在对象本质和ISA指针[https://www.jianshu.com/p...

  • 随笔记录(一)、isa 和 superClass

    isa 指针 instance(实例对象) isa 指针,指向的是==类对象==。 class(类对象) isa ...

  • iOS底层解析-----从isa指针看继承关系

    在NSObject对象的本质中提到对象中都存在isa指针,那么问题一:对象的isa指针指向哪里?问题二:OC的类信...

  • isa指针superclass

    isa指针的指向 实例对象的isa指针指向类对象 类对象的isa指针指向元类对象 isa的作用就是用来给实例找到各...

网友评论

    本文标题:【iOS】类的本质与isa指针

    本文链接:https://www.haomeiwen.com/subject/msvmdxtx.html