什么时候会unrecognized selector

当调用该对象的某个方法,该对象没有实现这个方法的时候,可以通过消息转发进行解决,如果还是不行就会报unrecognized selected异常。

object是动态语言,每个方法在运行时都会被转发为消息发送,即objc_megSend,整个过程如下:

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

三次拯救崩溃的机会

1、Method resolution :objc运行时会调用-resolveInstanceMethod或者 +resloveClassMethod让你有机会提供一个函数实现。如果你添加了函数并且返回了YES,那么运行时系统会重新启动一次消息转发的过程。如果返回NO,运行时会移到下一步,消息转发。

2、Fast forwarding:如果目标对象实现了-forwordingTargetForSelected runtime这时会调用这个方法,给你把这个消息转发给其他对象的机会,只要这个方法返回不是nil和self,整个消息转发的过程就会被重启,发送的对象会变成你返回的那个对象。否则,就会继续下一步消息转发。

3、Normal forwarding

首先会发送-methodSignatureForSelector 消息获取函数的参数和返回值类型。如果methodSighForSelector返回nil,rentime则会发出 doesNotRecognizeSelector消息,程序这时也就挂掉了。如果函数返回了一个函数签名,runtime就会创建一个NSInvocation对象并发送-forwordInvocation消息给目标对象。

你可能感兴趣的:(什么时候会unrecognized selector)