1.runtime的内容复习总结,知道了消息传递和消息转发的机制和内部原理。
runtime特性:
消息传递,消息转发
runtime是oc面向对象和动态机制的基石
oc通过运行时系统动态的创建类和对象,进行消息传递和消息转发,runtime扩展了oc,从系统层面解决了项目中的一些设计和技术的问题,消息传递时runtime的核心概念
runtime基本是用C语言和汇编写的
runtime消息传递的过程
1.首先通过对象的isa指针找到它的class
2.在class的method list中寻找foo
3.如果找不到foo就去superclass中找
4.一旦找到foo这个函数就执行它的实现IMP
但是这个流程在实现中存在问题,效率低下
runtime给出了解决方案:
objc-class中有一个重要的成员:objc-cache
之前经常被调用的方法被缓存到了这里,foo函数的method_name作为key,method_imp作为vlaue保存了起来,下载再去调用方法的时候会先去cache中找,避免每次都去遍历objc_method_list,提高了效率
消息传递的一些概念:
1,类对象(objc_class)
oc类是用class类型来表示的,类对象实际上是一个指向objc_class结构体的指针,里面包含了父类的指针,类的名字,版本,信息,实例大小,实例变量列表,方法列表,缓存,协议列表,class本身就是一个对象,称为类对象。
2.实例(objc_object)
类对象的isa指针的指向我们称之为元类(metaClass)
元类中包含了创建类属性和方法的全部信息
Pasted Graphic 2.png
实例对象的isa指针指向类对象
类对象的isa指针指向元类
元类的superclass指针指向了父类的元类
父类的元类的superclass指针指向了根类的元类
根类的元类的isa指针指向它自己
根类的元类的superclass指针指向了类对象(NSobject)
NSobject的superclass指针指向nil
3.method(函数)
能够独立完成一个功能的一段代码
4.SEL
是objc_selector的实例对象
@property SEL selector;
selector是SEL的实例对象,名字叫方法选择器,在oc中不允许名称相同参数不同的方法存在
5.IMP
指向最终实现程序内存地址的指针
6.objc_cache(类缓存)
存放了之前调用的方法,每次调用方法是不会先去方法列表中遍历,而是先去缓存中找,如果找不到再去方法列表中找。
7.Category(objc_category)
表示一个指向分类的结构体的指针
runtime消息转发
执行的最后三个步骤
1.动态方法解析
2.备用接收者
3.完整消息转发
Pasted Graphic.png
动态方法解析调用的方法是:resolveInstanceMethod,如果返回NO,执行备用接收者
备用接收者调用的方法是:forwardingTargetForSelector,返回空就执行完整消息转发
完整消息转发先调用的方法是: methodSignatureForSelector,如果返回了签名就继续执行
forwardInvocation,如果返回了空就抛出异常doesNotRecognizeSelector
2.算法部分看了三个问题:1.两数之和问题 2.数字反转问题 3.最大水量问题
网友评论