什么时候会报unrecognized selector异常?

  • 当调用对象(子类,各级父类)不含有对应方法的时候,并且依旧没有给出消息转发的具体方案的时候,程序运行时会crash并抛出unrecognized selector异常.
  • objective-c中的每个方法在运行时会被转化为消息发送objc_msgSend(reciver, selector)
  • 运行时会根据对象(reciever) 的isa指针找到该对象所对应的类,然后依次在对应的类,父类,父类的父类根类中找对应的方法

2.下面讲述对象发放的解析过程

  • 第一步:+(BOOL)resolveInstanceMethod:(SEL)sel实现方法,指定动态的添加方法.若返回NO,则进入下一步,若返回YES,则通过class_addMethod函数动态的添加方法,消息得到处理,此流程处理完毕.
  • 第二步:在第一步返回NO的时候进入,(id)forwardingTargetForSelector:(SEL)aSelector方法,这是运行时给我的第二次机会,用于指定那个对象响应这个Selector,不能指定self,若返回nil,则表示不处理,进入下一步,若返回某个对象,则会调用改对象的方法.
    *第三部:我们首先要通过- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector指定方法签名,若返回nil,则不处理,返回方法签名则会进入下一步
  • 第四步: 调用(void)forwardInvocation:(NSInvocation *)anInvocation方法,我们可以通过anInvocation做处理,重定向
  • 第五步:若没有实现- (void)forwardInvocation:(NSInvocation *)anInvocation,那么会进入- (void)doesNotRecognizeSelector:(SEL)aSelector,没有实现,则crash

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