OC对象的本质(下)

1、Instance实例对象内部存贮的是什么?

(1)、isa 指针

(2)、其他成员变量

2、类对象在内存中存储的信息主要包含:

  (1)、isa指针

  (2)、superClass指针

  (3)、类的属性信息(@property)、类的对象方法信息(instance medth)也就是实例方法

  (4)、类的协议信息(@protocol)、类的成员变量信息(ivar)(比如类型和名字)

 

@interface Person:NSObject
{
    @public
    int no;
}
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
      //instance对象,实例对象
        Person *person=[Person new];
        Person *person1=[Person new];
        
        NSLog(@"=====类对象===");
        //class 对象、类对象
        //class 方法返回的一直都是class对象,即类对象
        Class objcClass1=[person class];
        Class objcClass2=[person1 class];
        Class objcClass3=object_getClass(person);
        Class objcClass4=object_getClass(person1);
        Class objectClass5=[Person class];
        //不管调用多少次class返回的都是类对象
        Class objectClass6=[[Person class] class];
        NSLog(@"==类对象==%p==%p==%p==%p==%p==%p",objcClass1,objcClass2,objcClass3,objcClass4,objectClass5,objectClass6);
        
        //meta-class对象,元类对象
        //将类对象当做参数传入,获得元类对象
        Class objectMetaClass=object_getClass(objcClass1);
        NSLog(@"===元类对象==%p",objectMetaClass);        

    }
    return 0;
}

运行结果:
==类对象==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0
===元类对象==0x100001188

3、元类对象:

我们可以通过Runtime  API中的object_getClass()方法获取(将类对象当做参数传入,获得元类对象)

每个类对象在内存中有且只有一个元类对象(meta-class)。

meta-class对象和class对象的内存结构都是一样的,但是用途不一样,在内存中的存储的信息主要包括:

(1)、isa指针。

(2)、superclass。

(3)、类的类方法信息(class method)

(注意:我们可以通过class_isMetaClass()方法来判断是否是元类对象,

   object_getClass()可以传入三种类型的参数1.实例对象,2.类对象,3.元类对象。

  得到的结果也有三种:

传入的是实例对象时,获得是类对象(class 对象)

传入的是类对象时,获得是元类对象(meta-class对象)

传入的是元类对象时,获得是基类的元类对象(Root-meta-class对象)

4、在OC语言中对象可以分为三种:

   (1). 实例对象

   (2). 类对象

   (3).元类对象

   实例对象里面包含:成员变量(实例对象在底层就是结构体)

   类对象包含:isa、superclass、属性、实例方法、协议、成员变量

   元类对象包含:isa、superclass、类方法

isa指针:

instance的isa指向class类对象

当调用对象方法时,通过instance的isa找到class,最后调用对象方法的实现进行调用。

class的isa指向meta-class

当调用类方法时,通过类对象的isa找到meta-class,最后调用类方法的实现进行调用。

isa、superclass总结:

1、instance的isa指向class

2、class的isa指向meta-class

3、meta-class的isa指向基类的meta-class

4、class的superclass指向父类的class,如果没有父类,superclass指针为nil

5、meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class

6、instance调用对象方法的轨迹?

      答:isa找到class,方法不存在,就通过superclass找父类直到找到基类class,如果基类还没有找到这个方法则直接指向nil,抛出异常(没有找到方法)。

7、class调用类方法的轨迹?

      答:isa找到meta-class,方法不存在,就通过superclass找父类,父类不存在就继续找直到找到基类的meta-class元类对象,如果基类的元类对象没有找到类方法就通过superclass指向基类的类对象,如果还没有找到则指向nil。(抛出异常)

小结

对象的isa指针指向哪里?

instance对象的isa指针指向类对象。

类对象的isa指针指向元类对象。

元类对象的isa指针指向基类的元类对象。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值