在上篇面试题中可以看到每个对象都有一个isa指针.这个isa指针指向哪里?具体是什么作用呢?这篇面试题:OC对象的isa指针指向哪里?
OC的对象类型
首先要知道OC对象有哪些类型.
1.实例对象(instance对象);指通常我们创建的对象,用[NSObject alloc] init] ,[NSObject new]出来的对象;
2.类对象(class对象)
3.元类对象(meta-class对象)
实例对象
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
//object1、object2是NSObject的instance对象(实例对象)
//它们是不同的两个对象,分别占据着两块不同的内存
instance对象在内存中存储的信息包括:
1.isa指针
2.其他成员变量
类对象
类对象获取方式:
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class obj1Class = [obj1 class];
Class obj2Class = [obj2 class];
Class obj3Class = [NSObject class];
Class obj4Class = object_getClass(obj1);
Class obj5Class = object_getClass(obj2);
//obj1Class ~ obj5Class都是NSObject的class对象(类对象)
//它们是同一个对象。每个类在内存中有且只有一个class对象
class对象在内存中存储的信息主要包括
1.isa指针
2.superclass指针
3.类的属性信息(@property)、类的对象方法信息(instance method)
4.类的协议信息(protocol)、类的成员变量信息(ivar)
......
元类对象
元类对象获取方式:
Class objectMetaClass = object_getClass([NSObject class]);
//objectMetaClass是NSObject的meta-class对象(元类对象)
//每个类在内存中有且只有一个meta-class对象
meta-class对象在内存中存储的信息主要包括
1.isa指针
2.superclass指针
3.类的类方法信息(class method)
......
isa指针
1.instance的isa指向class
当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
2.class的isa指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
3.meta-class的isa指向基类的meta-class
4.基类的meta-class的isa指向自己
值得注意,这里的指向,其实在64bit后要&上一个mask就可以直接拿到指向的真实地址
superclass指针
1.子类的指向父类
2.父类指向基类
3.meta-class的superclass指向class
4.基类的superclass指向nil
isa指针与superclass指针指向,如下图:
isa指针与superclass指针指向
总结
对象的isa指针转向哪里?
instance对象的isa指向class对象
class对象的isa指向meta-class对象
meta-class对象的isa指向基类的meta-class对象
网友评论