这个是咱们比较常见的,执行以后,test1函数就指向hooktest1了函数
Class originalClass = objc_getClass("ViewControllerA"); SEL originalSelector = @selector(test1); SEL swizzledSelector = @selector(hooktest1); // 若originalClass已经存在test1方法,则返回NO Method originalMethod = class_getInstanceMethod(originalClass, originalSelector); Method swizzledMethod = class_getInstanceMethod(originalClass, swizzledSelector); BOOL didAddMethod = class_addMethod(originalClass,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod)); // 若原来的方法并不存在,则添加便可 if (didAddMethod) { class_replaceMethod(originalClass,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod)); } method_exchangeImplementations(originalMethod, swizzledMethod);
有一个问题,上面的作法是hook这个类的A函数指向B函数,如何hook这个类的A函数指向另外一个类的B函数呢?代码修改以下code
Class originalClass = objc_getClass("ViewControllerA"); Class swizzledClass = objc_getClass("ViewControllerB"); SEL originalSelector = @selector(test1); SEL swizzledSelector = @selector(hooktest1); // 若originalClass已经存在test1方法,则返回NO Method originalMethod = class_getInstanceMethod(originalClass, originalSelector); Method swizzledMethod = class_getInstanceMethod(swizzledClass, swizzledSelector); BOOL didAddMethod = class_addMethod(swizzledClass,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod)); // 若原来的方法并不存在,则添加便可 if (didAddMethod) { class_replaceMethod(originalClass,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod)); } method_exchangeImplementations(originalMethod, swizzledMethod);
实例函数和类函数,主要不一样点在于class_getInstanceMethod
和class_getClassMethod
,下面是hook类函数的写法。get
Class originalClass = objc_getClass("ViewControllerA"); Class swizzledClass = objc_getClass("ViewControllerB"); SEL originalSelector = @selector(test2); SEL swizzledSelector = @selector(hooktest2); // 若originalClass已经存在test2方法,则返回NO Method originalMethod = class_getClassMethod(originalClass, originalSelector); Method swizzledMethod = class_getClassMethod(swizzledClass, swizzledSelector); BOOL didAddMethod = class_addMethod(swizzledClass,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod)); // 若原来的方法并不存在,则添加便可 if (didAddMethod) { class_replaceMethod(originalClass,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod)); } method_exchangeImplementations(originalMethod, swizzledMethod);
还有一个不一样点,就是在不一样类的状况下,hook以后的函数,若是要调用原函数,实例函数的,只须要以下io
- (void)hooktest1 { [self hooktest1]; }
可是,hook以后的类函数,须要这样调用原函数class
+ (void)hooktest2 { [objc_getClass("ViewControllerB") hooktest2]; }
基本上就这些了,用的好就很方便了。test