iOS 底层 实例对象、类对象、元类对象 - AlvinSunny/OC-TheUnderlying GitHub Wiki
实例(instance)对象
instance对象又称:实例对象,在OC编程语言中是常常用到的对象;是一个类通过alloc方法创建出来的对象;并且每执行一次alloc方法都会产生新的instance对象; 生成的这个实例对象也就是:某某类的实例对象
如下图所示:
类(class)对象
注意:
类对象和实例对象不同,一个类对象不论调用多少次class方法,返回的都是同一个类,也就是说objectClass1、objectClass2、objectClass3、objectClass4、objectClass5指向的内存地址是相同的。
注解:
类的属性信息:指的是是否是原子锁、copy还是strong。
类的对象方法信息:指的是减号开头的方法,包含了方法名、方法传递参数类型等。
类的成员变量信息:指的是一个成员变量的名字、类型等信息,相当于描述信息。
类的协议信息:指的是协议相关的所有,比如协议方法名、协议方法是否是必须实现、协议名、协议方法传递参数类型等。
元类(meta class)对象
注意点:
- 元类对象的获取需要通过object_getClass() 来获取,而不是通过重复调用class方法
-
上图中说到meta-class对象和class对象的内存结构相同,图中有四个 null 代表的就是属性方法信息、协议信息是null;简单来说就是class对象有的在meta-class对象这里是空的。结构相同,但数据不同,用途也不同
-
如何判断一个类是否是一个元类对象 ?
需知:UIButton 实例对象的类对象是 UIButton;UIButton类对象的元类对象是UIButton
4.object_getClass(<#id _Nullable obj#>)和objc_getClass(<#const char * _Nonnull name#>) 的区别
object_getClass 传入参数是一个oc对象,用来获取类对象和元类对象的;传入实例对象获取到类对象,传入类对象获取到元类对象
objc_getClass 传入的是一个类名(C语言字符串),是用于查找一个类的, 如果找到了以这个字符串命名的类就返回该类, 找不到就返回nil