• 什么时候会报unrecognized selector的异常?


    • 当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决,如果还是不行就会报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:消息给目标对象
  • 相关阅读:
    selenium(六)Page Object模式(使用selenium的PageFactory)
    CodeForces 1325C Ehab and Path-etic MEXs(思维)
    CodeForces 1325D Ehab the Xorcist(异或和+算数和)
    家庭房产(模拟)
    取硬币(思维)
    Xor and Sum(异或和+算术和)
    一元三次方程求解(数学、二分)
    最大最小公倍数 (数学、贪心)
    天梯---球队“食物链”(DFS+剪枝)
    HDU-4857 逃生(逆向拓扑排序)
  • 原文地址:https://www.cnblogs.com/huangzs/p/4731135.html
Copyright © 2020-2023  润新知