Objective-C 中的对象主要可以分为3种:
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
instance 对象
instance 对象就是通过类 alloc 出来的对象,每次调用 alloc 都会产生新的 instance 对象。
object1、object2 是 NSObject 的 instance 对象,它们是不同的两个对象,分别占据着两块不同的内存。
instance 对象在内存中存储的信息
- isa指针
- 其他成员变量
定义 Person
创建 Person 的实例对象
p1、p2 对象在内存中存储的信息
class 对象
每个类在内存中有且只有一个 class 对象,同一个类 alloc 出来的实例对象共同拥有唯一的 class 对象。
获取 class 对象:
objectClass1 ~ objectClass5 都是 NSObject 的 class 对象,它们是同一个对象。
👉 注意:
下面这行代码获取的 objectClass 是 class 对象,并不是 meta-class 对象,-(void)Class 和 +(void)Class 返回的是类对象。
class 对象在内存中存储的信息主要包括
- isa 指针
- superclass 指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
……
不同的 instance 对象却拥有相同的属性、对象方法、协议和成员变量等等,这些信息都存放在 class 对象的内存中,保证了同样的信息只存储一份。
meta-class 对象
每个类在内存中有且只有一个 meta-class 对象。通过 object_getClass 方法,将类对象当做参数传入,获得元类对象:
meta-class 对象在内存中存储的信息主要包括
- isa 指针
- superclass 指针
- 类的类方法信息(class method)
……
通过 class_isMetaClass 方法查看 objecClass 是否为 meta-class:
窥视 objc_getClass()、object_getClass()
object_getClass
打开 Runtime 源码 objc4-781,找到 objc-class.mm,搜索 object_getClass:
object_getClass 的参数是 instance 对象/ class 对象/ meta-class 对象。object_getClass 返回的是 obj 的 isa 指针。
如果 obj 是 instance 对象则返回 class 对象。
如果 obj 是 class 对象则返回 meta-class 对象。
如果 obj 是 meta-class 对象则返回 NSObject(基类) 的 meta-class 对象。
objc_getClass
打开 Runtime 源码,找到 runtime.mm,搜索 objc_getClass:
上面👆的代码里可以确认 objc_getClass 的参数是一个类名。
Jump To Definition -> look_up_class:
Jump To Definition -> getClassExceptSomeSwift:
Jump To Definition -> getClass_impl:
Jump To Definition -> NXMapGet:
NXMapGet 根据传进来的类名返回了一个类对象。
Class objc_getClass(const char *aClassName) :字符串类名 -> 对应的类对象