首先需要加上头文件#import<objc/runtime.h>和#Import<objc/message.h>
 
将A中的某个方法替换成B中某个方法,且没有任何的耦合
这里是RuntimeCar中的代码
+ (void)load {
    Class orginClass = NSClassFromString(@"Car”); // 这里我对Class的理解是指向这个自定义类的指针
    Class currentClass = [self class];
   
    SEL orginSelecter = NSSelectorFromString(@"run:”); // 个人感觉这个SEL是一个函数指针(这里对SEL和Method的理解是这样的,SEL是相对于Class的指向函数的一个指针;而Method是相对于整个内存指向函数的一个指针,Method是需要Class和SEL才能获得。也不知道这里理解的对不对?)
    SEL currentSelecter = @selector(runtime_run:);
   
    Method orginMethod = class_getInstanceMethod(orginClass, orginSelecter); // 这个Method似乎也是一个函数指针
    Method currentMethod = class_getInstanceMethod(currentClass, currentSelecter);
   
    BOOL results = class_addMethod(orginClass, currentSelecter, method_getImplementation(currentMethod), method_getTypeEncoding(currentMethod)); // 由A中引出一个指针指向B中需要替换的方法(感觉就是将B中的方法加到A中去)
   
    if (!results) {
        return;
    }
   
    orginMethod = class_getInstanceMethod(orginClass, currentSelecter); // 将Method重新指向,
    if (!orginMethod) {
        return;
    }

class_replaceMethod(orginClass, currentSelecter, method_getImplementation(orginMethod), method_getTypeEncoding(orginMethod));
    class_replaceMethod(orginClass, orginSelecter, method_getImplementation(currentMethod), method_getTypeEncoding(currentMethod));
}

- (void)runtime_run:(int)speed {
    if (speed < 120) {
        NSLog(@"%@ speed:%d", self, speed); // 这里self最后打印出来的,是Car
    } 
    NSLog(@"runtimeMethod");
}

在Car中只需要在.h和.m中加上相应的代码
最后直接调用Car中的run方法,对于什么时候运行的RuntimeCar中load方法
   网上资料:iOS会在运行期提前并且自动调用这两个方法+(void)initialize和+(void)load
05-16 22:51