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

  参数为字符串类名字

  返回值为 类对象

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

posted @   A7d  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示