美文网首页
02.Objective-C 对象的分类

02.Objective-C 对象的分类

作者: ProfessorFan | 来源:发表于2021-01-04 20:08 被阅读0次

问题

  1. Objective-C对象分类
  2. 整么获取到class对象,整么获取到meta-class对象
  3. class对象什么时候创建,meta-class对象什么时候创建
  4. instance,class,meta-class 三种对象有什么区别.
  5. isa,superclass 总结
  6. instance(实例对象)调用方法的轨迹
  7. meta-class对象调用类方法的轨迹

实践

  1. Objective-C对象分类
    a. instance对象 (实例对象)
    b. class 对象(类对象)
    c. meta-class 对象(元类对象)

  2. 整么获取到class对象,整么获取到meta-class对象

获取class对象

NSObject *obj = [NSObject new];

方法一:
Class  class_obj1 = [obc class];
方法二:
Class class_obj2 = [NSObject class];
方法三:
#import <objc/runtime.h>
Class class_obj3 = object_getClass(obj); // 这个是Runtime 的API

获取meta-class对象

#import <objc/runtime.h>
NSObject *obj = [NSObject new];

方法一:
Class class_meta1 = Object_getClass([obj class]);

方法二:
Class class_meta2 = Object_getClass([NSObject class]);

  1. class对象什么时候创建,meta-class对象什么时候创建
    由于class对象和meta-class 对象只存在一份,系统在第一次使用的时候,就会创建一个类的 类对象(class对象)和元类对象(meta-class对象).
  2. instance,class,meta-class 三种对象有什么区别.


    Objective-C对象图.png

相同点:都有一个isa 指针

不同点:

instance(实例对象):

isa ->指向class对象(类对象)

isa的地址 & ISA_MASK 就是class对象(类对象的地址值)

可能存在很多个对象

class对象(类对象):

isa ->指向meta-class 对象(元类对象)

isa的地址 & ISA_MASK 就是元类对象(meta-class的地址值)

superclass -> 指向 父类的class对象(类对象)

superclass 指向的地址就是父类的class对象(类对象)地址

属性,对象方法,协议方法,成员变量,这个是基础知识.

该类系统中只存在一个

class-meta对象(元类对象):

isa ->指向基类meta-class对象(基类元类对象)

isa的地址 & ISA_MASK 就是元类对象(meta-class的地址值)

superclass -> 指向 父类的class-meta对象(元类对象)

类方法

该类系统中只存在一个

  1. isa,superclass 总结


    Objective-C对象指向关系图.png

说明:

  • instance 的isa 指向class对象
  • class对象 的 isa 指向 meta-class对象
  • meta-class 对象的 isa 指向基类的的meta-class对象
  • class对象的superclass 指向父类的 class对象,如果没有父类,则superclass 指向 nil
    *class-meta对象的superclass 指向父类的meta-class对象
    *基类的class-meta对象的superclass指针指向 基类的class对象(类对象)
  1. instance(实例对象)调用方法的轨迹
    实例对象的isa 找到该实例对象的class对象,在类对象中方法列表中寻找,如果没有找到,通过class对象中的superclass 找到父类的class对象的方法是否存在该方法,如果一直到基类class对象都没有找到,就会报错奔溃
  2. meta-class对象调用类方法的轨迹
    meta-class对象中如果没有这个类方法,通过superclass 找到父类中是否存在该方法,一直找下去,如果在基类meta-class 对象中都还没有找到,最后还会在找到基类中的类对象方法列表中是否存在,如果没有找到,就会报错奔溃.

相关文章

  • 02.Objective-C 对象的分类

    问题 Objective-C对象分类 整么获取到class对象,整么获取到meta-class对象 class对象...

  • 对象的分类

    对象的分类 对象分为 实例对象、类对象、元类对象 对象的数据结构 1. 实例对象 转化成c++代码以后可以发现 可...

  • 对象分类

    ECMA标准固有对象 https://www.ecma-international.org/ecma-262/9....

  • 12.2.类分类

    分类.h文件: 分类.m文件: 关联对象

  • javascripts面向对象基础

    js中对象的分类 对象的分类: 1.内置对象:由ECMA实现 的,不依赖于宿主环境的对象,这些对象在js程序执行之...

  • RunTime之NSObject解析

    写在前边 上篇文章中,介绍了Objc对象的分类:实例对象、类对象、元类对象;也介绍了对象分类中通过isa或supe...

  • OC对象的分类

    写在前面 一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。 不晕的外圈 OC ...

  • OC对象的分类

    OC对象的分类 - instance对象(实例对象) instance对象就是通过类alloc出来的对象,每次调用...

  • OC对象的分类

    1.instance对象(实例对象)通过类alloc出来的对象 是不同的对象,分别占用不同的内存, instanc...

  • OC对象的分类

    Objective-C中的对象,主要可以分为3种 1. instance对象(实例对象)2. class对象(类对...

网友评论

      本文标题:02.Objective-C 对象的分类

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