一、objc_getClass
首先我们看一下objc_getClass的内部实现是:objc_getClass(const char * _Nonnull name) 从这里只能看出需要传入一个字符串的类名, Returns the class definition of a specified class 返回对应的类对象。请看下面的截图

从这里可以看出是runtime的相关的,我们就可以从苹果开源的源码查看分析
(源码链接下载链接 找到objc目录下,打开下载数字最大的,代表最新的)

从上面的截图和描述都可以看出,传入的是一个字符串的类名,返回的是对应的类对象。
(有兴趣的可以接看look_up_class对应的实现)。
二.object_getclass
首先我们都知道NSObject的对象类型是有三种:实例对象(instance)、类对象(class)、元类对象(meta-class)。先看源码实现

从这里可以看出,它返回的是isa指针。如果传入的obj是instance对象,返回class对象;如果传入的是class对象,返回meta-class对象;如果传入的是meta-class对象,返回NSObject(基类)的meta-class对象。
下面粘贴调试代码:

总结:
1.objc_getClass(const char * _Nonnull name)
a.传入字符串类名,返回对应的类对象
2.object_getclass
a.传入的obj可能是instance对象、class对象、meta-class对象
b.如果是instance对象,返回class对象
c.如果是class对象,返回的是meta-class对象
d.如果是meta-class对象,返回NSObject(基类)的meta-class对象。
接下来我会介绍 instance对象、class对象、meta-class对象区别!如有兴趣请关注我😄!
网友评论