• 当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决,如果还是不行就会报unrecognized selector异常
  • objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:

    • objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类
    • 然后在该类中的方法列表以及其父类方法列表中寻找方法运行
    • 如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会
  • 三次拯救程序崩溃的机会

    • Method resolution

      • objc运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:,让你有机会提供一个函数实现。
      • 如果你添加了函数并返回 YES,那运行时系统就会重新启动一次消息发送的过程
      • 如果 resolve 方法返回 NO ,运行时就会移到下一步,消息转发
    • Fast forwarding
      • 如果目标对象实现了-forwardingTargetForSelector:,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会
      • 只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。
      • 否则,就会继续Normal Fowarding。
      • 这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但Normal forwarding转发会创建一个NSInvocation对象,相对Normal forwarding转发更快点,所以这里叫Fast forwarding
    • Normal forwarding
      • 这一步是Runtime最后一次给你挽救的机会。
      • 首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。
      • 如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。
      • 如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象

最新文章

  1. SQL中Group By的使用
  2. Emag eht htiw Em Pleh(imitate)
  3. Cash Machine_多重背包
  4. Entity Framework学习笔记(一)
  5. codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
  6. 几个排序算法的JS实现
  7. windows service 安装和卸载指令
  8. boost xpressive 例子
  9. SELECT TOP 1 * FROM是什么意思
  10. node.js框架express的安装
  11. CSS以图换字的9种方法
  12. flask中的session,render_template()第二和参数是字典
  13. Jfinal控制器源码解读
  14. 关于webService发布的wsdl中的import问题解决
  15. 理解WebKit和Chromium: Chromium网络栈
  16. 王者荣耀交流协会final发布-第3次scrum立会
  17. 关于前端滚动条,input框等样式的修改
  18. Django 数据库迁移
  19. hql和sql练习题
  20. [COGS2554][SYZOJ247][福利]可持久化线段树

热门文章

  1. ABI and ISA
  2. 【洛谷4459】[BJOI2018] 双人猜数游戏(动态规划)
  3. VERITA Netbackup日常巡检详细说明
  4. sqlserver 使用小技巧总结
  5. Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
  6. Token的概念
  7. 获取页面的url
  8. 在Linux文件清空的几种方法
  9. ReactiveObjC框架的简单介绍
  10. Swift项目,适配遇到的问题