02.Objective-C 对象的分类

2021-01-04  本文已影响0人  ProfessorFan

问题

  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

说明:

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

猜你喜欢

热点阅读