iOS 底层 实例对象、类对象、元类对象 - AlvinSunny/OC-TheUnderlying GitHub Wiki

实例(instance)对象

instance对象又称:实例对象,在OC编程语言中是常常用到的对象;是一个类通过alloc方法创建出来的对象;并且每执行一次alloc方法都会产生新的instance对象; 生成的这个实例对象也就是:某某类的实例对象

如下图所示:

类(class)对象

注意:

类对象和实例对象不同,一个类对象不论调用多少次class方法,返回的都是同一个类,也就是说objectClass1、objectClass2、objectClass3、objectClass4、objectClass5指向的内存地址是相同的。

注解:

类的属性信息:指的是是否是原子锁、copy还是strong。

类的对象方法信息:指的是减号开头的方法,包含了方法名、方法传递参数类型等。

类的成员变量信息:指的是一个成员变量的名字、类型等信息,相当于描述信息。

类的协议信息:指的是协议相关的所有,比如协议方法名、协议方法是否是必须实现、协议名、协议方法传递参数类型等。

元类(meta class)对象

注意点:

  1. 元类对象的获取需要通过object_getClass() 来获取,而不是通过重复调用class方法
  1. 上图中说到meta-class对象和class对象的内存结构相同,图中有四个 null 代表的就是属性方法信息、协议信息是null;简单来说就是class对象有的在meta-class对象这里是空的。结构相同,但数据不同,用途也不同

  2. 如何判断一个类是否是一个元类对象 ?

需知:UIButton 实例对象的类对象是 UIButton;UIButton类对象的元类对象是UIButton

4.object_getClass(<#id _Nullable obj#>)和objc_getClass(<#const char * _Nonnull name#>) 的区别

object_getClass 传入参数是一个oc对象,用来获取类对象和元类对象的;传入实例对象获取到类对象,传入类对象获取到元类对象

objc_getClass 传入的是一个类名(C语言字符串),是用于查找一个类的, 如果找到了以这个字符串命名的类就返回该类, 找不到就返回nil