XB_对象的分类(1)

对象分实例对象、类对象、元类对象三种类型

1.实例对象(instance对象)

 NSObject *obj = [[NSObject alloc]init];

是通过类alloc出来的对象,里边存储的有isa指针和成员变量

2.类对象(class对象)

 NSObject *object1 = [[NSObject alloc] init];
 NSObject *object2 = [[NSObject alloc] init];
        
 Class objectClass1 = [object1 class];
 Class objectClass2 = [object2 class];
 Class objectClass3 = object_getClass(object1);
 Class objectClass4 = object_getClass(object2);
 Class objectClass5 = [NSObject class];

objectClass1-5全都是类对象,并且都是同一个对象,也就是每个类在内存中只有一个class对象

里边存储的信息有 isa指针、superclass指针、类的属性信息(@property)、类的对象方法信息(instance method)、类的协议信息(protocol)、类的成员变量信息(ivar)

假如实例对象有个 int _age 的成员变量,那么所谓的成员变量信息就是这个成员变量的类型啊名字等等这些信息,类的属性信息类似,协议信息就是遵循的协议的相关信息。

3.元类对象(meta-class对象)

 NSObject *object1 = [[NSObject alloc] init];
 NSObject *object2 = [[NSObject alloc] init];
        
// class对象,类对象
// class方法返回的一直是class对象,类对象
 Class objectClass1 = [object1 class];
 Class objectClass2 = [object2 class];
 Class objectClass3 = object_getClass(object1);
 Class objectClass4 = object_getClass(object2);
 Class objectClass5 = [NSObject class];
        
// meta-class对象,元类对象
// 将类对象当做参数传入,获得元类对象
 Class objectMetaClass = object_getClass(objectClass1);
 Class objectMetaClass = object_getClass(objectClass3);
 Class objectMetaClass = object_getClass(objectClass5); 

元类对象的内存结构与class对象的内存结构是一样的:isa指针、superclass指针、类的类方法信息(class method)只是其他的是nil

注意点:

需要注意的是

 1.Class objc_getClass(const char *aClassName)

 1> 传入字符串类名

 2> 返回对应的类对象

 

 2.Class object_getClass(id obj)

 1> 传入的obj可能是instance对象、class对象、meta-class对象

 2> 返回值

 a) 如果是instance对象,返回class对象

 b) 如果是class对象,返回meta-class对象

 c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

 

 3.- (Class)class、+ (Class)class

 1> 返回的就是类对象,就算[[[NSObject class] class] class]也是返回类对象而不是元类对象

 

 - (Class) {

     return self->isa;

 }

 

 + (Class) {

     return self;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值