一.消息轉(zhuǎn)發(fā)機(jī)制
? ??void?sendMessage(idself,SEL_cmd,NSString* msg){
? ????? NSLog(@"1===hello");
????}
? 1.動(dòng)態(tài)方法解析(resolveInstanceMethod)
????+ (BOOL)resolveInstanceMethod:(SEL)sel{
??????????if([NSStringFromSelector(sel) isEqualToString:@"sendMessage:"]){
? ? ? ?????returnclass_addMethod(self, sel, (IMP)sendMessage,"v@:@");
? ????? }
? ????? return NO;
????}
? 2.快速轉(zhuǎn)發(fā)(forwardingTargetForSelector)
????- (id)forwardingTargetForSelector:(SEL)aSelector{
????? ? NSString* methodName =NSStringFromSelector(aSelector);
????? ? if([methodNameisEqualToString:@"sendMessage:"]){
? ? ????? ? return[MessageObjectnew];
????? ? }
????? ? return [super forwardingTargetForSelector:aSelector];
????}
? 3.慢速轉(zhuǎn)發(fā)
? ? 方法1.methodSignnatureForSeletor
? ? 方法2.forwardinvocation
????- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
????? ? NSString*methodName =NSStringFromSelector(aSelector);
? ????? if([methodNameisEqualToString:@"sendMessage:"]){
? ? ? ? return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
? ? }
? ????? return [super methodSignatureForSelector:aSelector];
????}????
????- (void)forwardInvocation:(NSInvocation*)anInvocation{
????? ? SELsel = [anInvocationselector];
????? ? MessageObject *object = [MessageObject new];
????? ? if([objectrespondsToSelector:sel]){
? ? ????? ? [anInvocationinvokeWithTarget:object];
????? ? }else{????
? ? ????? ? [superforwardInvocation:anInvocation];????
? ????? }
????}
? 4.方法沒實(shí)現(xiàn)調(diào)用
? doesNotRecognizeSelector
- (void)doesNotRecognizeSelector:(SEL)aSelector{
? ? NSLog(@"方法未實(shí)現(xiàn)");
}