问题
- Objective-C对象分类
- 整么获取到class对象,整么获取到meta-class对象
- class对象什么时候创建,meta-class对象什么时候创建
- instance,class,meta-class 三种对象有什么区别.
- isa,superclass 总结
- instance(实例对象)调用方法的轨迹
- meta-class对象调用类方法的轨迹
实践
-
Objective-C对象分类
a. instance对象 (实例对象)
b. class 对象(类对象)
c. meta-class 对象(元类对象) -
整么获取到class对象,整么获取到meta-class对象
获取class对象
NSObject *obj = [NSObject new];
方法一:
Class class_obj1 = [obc class];
方法二:
Class class_obj2 = [NSObject class];
方法三:
#import <objc/runtime.h>
Class class_obj3 = object_getClass(obj); // 这个是Runtime 的API
获取meta-class对象
#import <objc/runtime.h>
NSObject *obj = [NSObject new];
方法一:
Class class_meta1 = Object_getClass([obj class]);
方法二:
Class class_meta2 = Object_getClass([NSObject class]);
- class对象什么时候创建,meta-class对象什么时候创建
由于class对象和meta-class 对象只存在一份,系统在第一次使用的时候,就会创建一个类的 类对象(class对象)和元类对象(meta-class对象). -
instance,class,meta-class 三种对象有什么区别.
Objective-C对象图.png
相同点:都有一个isa 指针
不同点:
instance(实例对象):
isa ->指向class对象(类对象)
isa的地址 & ISA_MASK 就是class对象(类对象的地址值)
可能存在很多个对象
class对象(类对象):
isa ->指向meta-class 对象(元类对象)
isa的地址 & ISA_MASK 就是元类对象(meta-class的地址值)
superclass -> 指向 父类的class对象(类对象)
superclass 指向的地址就是父类的class对象(类对象)地址
属性,对象方法,协议方法,成员变量,这个是基础知识.
该类系统中只存在一个
class-meta对象(元类对象):
isa ->指向基类meta-class对象(基类元类对象)
isa的地址 & ISA_MASK 就是元类对象(meta-class的地址值)
superclass -> 指向 父类的class-meta对象(元类对象)
类方法
该类系统中只存在一个
-
isa,superclass 总结
Objective-C对象指向关系图.png
说明:
- instance 的isa 指向class对象
- class对象 的 isa 指向 meta-class对象
- meta-class 对象的 isa 指向基类的的meta-class对象
- class对象的superclass 指向父类的 class对象,如果没有父类,则superclass 指向 nil
*class-meta对象的superclass 指向父类的meta-class对象
*基类的class-meta对象的superclass指针指向 基类的class对象(类对象)
- instance(实例对象)调用方法的轨迹
实例对象的isa 找到该实例对象的class对象,在类对象中方法列表中寻找,如果没有找到,通过class对象中的superclass 找到父类的class对象的方法是否存在该方法,如果一直到基类class对象都没有找到,就会报错奔溃 - meta-class对象调用类方法的轨迹
meta-class对象中如果没有这个类方法,通过superclass 找到父类中是否存在该方法,一直找下去,如果在基类meta-class 对象中都还没有找到,最后还会在找到基类中的类对象方法列表中是否存在,如果没有找到,就会报错奔溃.
网友评论