iOS-class、object_getClass、objc_getClass、objc_getMetaClass区别
在Objective-C的类型结构中,有几个比较重要的概念:Object(实例),Class(类),Metaclass(元类),Rootclass(根类),Rootclass‘s metaclass(根元类),且这些都是对象。
它们之间的关系可以用一张经典图来表述:

1.class 方法
实例方法 - (CLass)class;
类方法 + (Classs)class
它们的源码为:
// 类方法,返回自身
+ (Class)class {
return self;
}
// 实例方法,查找isa(类)
- (Class)class {
return object_getClass(self);
}
比如 Person *p = [[Person alloc] init] ;
Class a = [p class]; //此时a指向的是类对象
Class b = [a class]; //依然为类对象
2、object_getClass方法
object_getClass(id _Nullable obj) ;
参数可以是任意类型,类对象,实例对象,元类;返回值为参数isa指针指向的类;
1) 实例对象, 返回值为类对象
2) 类对象。 返回值为元类
3)元类。返回值为NSobject的元类
Class object_getClass(id obj){
if(obj){ return obj->getIsa(); }
else return nil;
}
比如:
Person *p = [[Person alloc] init] ;
Class aclass =object_Class(p); //aclass相当于 [p class];
Class bclass = object_Class(aclass); //bclass 为元类;
3.objc_getClass(const char *_Nonnull name)
参数为字符串类名字
返回值为 类对象
4 objc_getMateClass(const char *_Nonnull name)
(1)传入参数:字符串类名
(2)返回值:对应类的元类对象
Student *s=[Student new];
Class text1 = [s class];
Class text2 = [Student class];
Class a = object_getClass(s);
Class b= object_getClass([Student class]);
Class c = objc_getMetaClass("Student");
Class d= objc_getClass("s");
NSLog(@"%p",s);
NSLog(@"%p",text1);
NSLog(@"%p",text2);
NSLog(@"%p",a);
NSLog(@"%p",b);
NSLog(@"%p",c);
NSLog(@"%p",d);
text[16565:675849] s=0x10074c470. //实例对象地址
text[16565:675849] text1=0x1000089c8 //类对象地址
text[16565:675849] text2=0x1000089c8
text[16565:675849] a=0x1000089c8
text[16565:675849] b=0x1000089a0。 //元类地址
text[16565:675849] c=0x1000089a0
text[16565:675849] d=0x1000089c8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!