主要是这两个帖子
然后,关于里面的代码实现有2个比较不错的博客,可以参考
http://blog.sunnyxx.com
另外还可以补充其他一些:
//-----------------------------------刨根问底Objective-C Runtime ---------------------
就这些基本能搞懂这个runtime的原理了。
自己写了一个小例子:
A: 首先现在控制器里面初始化一个对象,然后调用对象的方法:
#import "ViewController.h"#import "Message.h"#import "NSObject+AssociatedObject.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; Message *message = [Message new]; [message sendMessage:@"Sam Lau"]; }@end
B: 对象First的声明:
//// Message.h// RuntimeDemo//// Created by caijunrong on 7/15/15.// Copyright © 2015 caijunrong. All rights reserved.//#import@interface Message : NSObject- (void)sendMessage:(NSString *)word;@end
对象First的实现:
//// Message.m// RuntimeDemo//// Created by caijunrong on 7/15/15.// Copyright © 2015 caijunrong. All rights reserved.//#import "Message.h"#import "MessageForwarding.h"#import@implementation Message//- (void)sendMessage:(NSString *)word//{// NSLog(@"normal way : send message = %@", word);//}//- (void)sendOtherMessage:(NSString *)word{// NSLog(@"sendOtherMessage word:%@",word);//}#pragma mark - Method Resolution/// override resolveInstanceMethod or resolveClassMethod for changing sendMessage method implementation+ (BOOL)resolveInstanceMethod:(SEL)sel{ if (sel == @selector(sendMessage:)) { //如果是这个方法的话,重新定义一个新的方法,映射过去 class_addMethod([self class], sel, imp_implementationWithBlock(^(id self, NSString *word) { NSLog(@"word = %@", word); //通过这种方法可以讲找不到的方法重新定义到别的方法去 [self sendOtherMessage:word]; }), "v@*"); } return YES;}#pragma mark - Fast Forwarding//- (id)forwardingTargetForSelector:(SEL)aSelector//{// if (aSelector == @selector(sendMessage:)) {// return [MessageForwarding new];// }// // return nil;//}#pragma mark - Normal Forwarding- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{ NSMethodSignature *methodSignature = [super methodSignatureForSelector:aSelector]; if (!methodSignature) { methodSignature = [NSMethodSignature signatureWithObjCTypes:"v@:*"]; } return methodSignature;}- (void)forwardInvocation:(NSInvocation *)anInvocation{ MessageForwarding *messageForwarding = [MessageForwarding new]; if ([messageForwarding respondsToSelector:anInvocation.selector]) { [anInvocation invokeWithTarget:messageForwarding]; }}@end
对象Second的声明:
//// MessageForwarding.h// RuntimeDemo//// Created by caijunrong on 7/15/15.// Copyright © 2015 caijunrong. All rights reserved.//#import@interface MessageForwarding : NSObject- (void)sendMessage:(NSString *)word;- (void)sendOtherMessage:(NSString *)word;@end
对象Second的实现:
//// MessageForwarding.m// RuntimeDemo//// Created by caijunrong on 7/15/15.// Copyright © 2015 caijunrong. All rights reserved.//#import "MessageForwarding.h"@implementation MessageForwarding- (void)sendMessage:(NSString *)word{ NSLog(@"fast forwarding way : send message = %@", word);}- (void)sendOtherMessage:(NSString *)word{ NSLog(@"MessageForwarding sendOtherMessage word:%@",word);}@end