iOS底层学习-Day_02

OC对象的分类

OC对象主要分为三类:instance(实例对象),class (类对象),meta-class(元类对象)

一、实例对象:

实例对象就是通过类调用alloc来产生的instance,每一次调用的alloc都是产生新的实例对象,内存地址都是不一样的,占据着不同的内存 eg:

NSObject *objc1 = [[NSObject alloc]init];
NSObject *objc2 = [[NSObject alloc]init];
        
NSLog(@"instance----%p %p",objc1,objc2);

 

instance实例对象存储的信息:
1.isa指针

2.其他成员变量

 我们平时说打印出来的实例对象的地址开始就是指的是isa的地址,即isa的地址排在最前面,就是我们实例对象的地址

 

二、类对象

  • 类对象的获取
Class Classobjc1 = [objc1 class];
Class Classobjc2 = [objc2 class];
Class Classobjc3 = object_getClass(objc1);
Class Classobjc4 = object_getClass(objc2);
Class Classobjc5 = [NSObject class];
NSLog(@"class---%p %p %p %p %p ",Classobjc1,Classobjc2,Classobjc3,Classobjc4,Classobjc5);

class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140

 从打印的结果我们可以看到,所有指针指向的类对象的地址是一样的,也就是说一个类的类对象只有唯一的一个

  • 类对象的作用

类对象存储的信息:
1.isa指针
2.superclass指针
3.类的方法(method,即减号方法),类的属性(@property),协议信息,成员变量信息(这里的成员变量不是指的值,因为每个对象的值是由每个实例对象所决定的,这里指的是成员变量的类型,比如整形,字典,字符串,以及成员变量的名字)

 

  • 元类对象

1.元类对象的获取

        Class metaObjc1 = object_getClass([NSObject class]);
        Class metaObjc2 = object_getClass(Classobjc1);
        Class metaObjc3 = object_getClass(Classobjc3);
        Class metaObjc4 = object_getClass(Classobjc5);

NSLog(@"meta---%p %p %p %p",metaObjc1,metaObjc2,metaObjc3,metaObjc4);
2020-09-22 16:12:10.191008+0800 OC底层[1131:77555] instance----0x60000000c2e0 0x60000000c2f0
2020-09-22 16:12:10.191453+0800 OC底层[1131:77555] class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140
2020-09-22 16:12:10.191506+0800 OC底层[1131:77555] meta---0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0

 获取元类对象的方法就是利用runtime方法,传入类对象,就可以获取该类的元类对象,从打印的结果可以看出,所有的指针地址一样,也就是说一个类的元类只有唯一的一个

 

元类存储结构:
元类的存储结构和类存储结构是一样的,但是存储的信息和用途不一样,元类的存储信息主要包括:
1.isa指针
2.superclass指针
3.类方法(即加号方法)

 

 

Runtime中的 objc_getClass() 和 object_getClass()区别
objc_getClass(“Person”)
Class objc_getClass(const char *aClassName)
传入字符串类名
返回对应的类对象
object_getClass(id obj) 更常用
传入的obj可能是instance对象、class对象、meta-class对象
返回值:
如果是instance对象,返回class对象
如果是class对象,返回meta-class对象
如果是meta-class对象,返回NSObject(基类)的meta-class对象

 

 

 

 1、isa指针

instance对象的isa指针指向class对象(UIView的isa是UIView)

class对象的isa指针指向meta-class对象(UIVIew的isa是UIView(meta-class))

meta-class对象的isa指针指向基类的meta-class对象 ,

2、superclass指针

class对象的superclass指针指向父类的class对象

如果没有父类,superclass指针为nil

meta-class对象的superclass指针指向父类的meta-class
基类的meta-class的superclass指针指向基类的class对象

3、instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找到父类class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类

 

posted @ 2024-05-08 15:12  时光清浅、  阅读(10)  评论(0)    收藏  举报