HOOK方法的使用
导入第三方框架:Aspects
UIView *v = [UIView new];
[self.view addSubview:v];
//NSSelectorFromString方法,系统会为其找到字符串所对应的方法
//AspectPositionBefore( = 2 ):在钩子方法之前调用闭包
//AspectPositionInstead( = 1 ):闭包替换钩子方法
//AspectPositionAfter( = 0 ):在钩子方法之后调用闭包
[v aspect_hookSelector: NSSelectorFromString(@"dealloc") withOptions:AspectPositionBefore usingBlock:^{
NSLog(@"--view dealloc--");
}error:nil];
performSelector方法: 找出一个函数类没有对外显示的方法
Animal *ani = [Animal new];
[ani performSelector:@selector(demoFunc)];
[self performSelector:@selector(xxx)];
//方法没有实现
- (void)doesNotRecognizeSelector:(SEL)aSelector {
NSLog(@"---->%@",NSStringFromSelector(aSelector));
//若不调用父类方法,则不会打印错误信息
[super doesNotRecognizeSelector:aSelector];
}
将类的两个实例的实例函数方法进行交换
#import "Cat.h"
#import <objc/objc-runtime.h>
@implementation Cat
- (void)printA{
NSLog(@"A");
}
- (void)printB{
NSLog(@"B");
}
- (void)demoFunc{
Method method_A = class_getInstanceMethod([self class], @selector(printA));
Method method_B = class_getInstanceMethod([self class], @selector(printB));
method_exchangeImplementations(method_A, method_B);
}
@end
没有调用交换方法时,打印输出: A B
调用方法之后,打印输出: B A
Cat *cat = [Cat new];
//调用函数,交换打印输出
[cat demoFunc];
[cat printA];
[cat printB];
网友评论