Objective-C是动态语言,方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector)。
objc向对象发送消息时,runtime会根据isa指针找到对象所属类,从该类及父类方法列表寻找方法运行 如果没有找到便会抛出异常 unrecognized selector sent to xxx, 但是在这之前有三次拯救机会:
1.Method resolution 方法解析处理阶段
如果调用了方法 首先会调用+(BOOL)resolveInstanceMethod:(SEL)sel【对象方法】, +(BOOL)resolveClassMethod:(SEL)sel【类方法】进行判断,如果YES能接收消息,NO就会进行第二步。
+(BOOL)resolveInstanceMethod:(SEL)sel;
+(BOOL)resolveClassMethod:(SEL)sel;
2.Fast forwarding 快速转发阶段
如果第一步返回NO,则进入消息转发第二步。
-(id)forwardingTargetForSelector:(SEL)aSelector;
3.Normal forwarding 常规转发阶段
如果第二返回self或nil,则进入第三步。
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
-(void)forwardInvocation:(NSInvocation *)anInvocation;
实际用途:
1、热更新
2、@dynamic添加getter setter方法
3、多重代理
4、多重继承