美文网首页
面向切片编程:钩子方法(hook)

面向切片编程:钩子方法(hook)

作者: Dove_Q | 来源:发表于2016-09-26 18:51 被阅读121次

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];

相关文章

网友评论

      本文标题:面向切片编程:钩子方法(hook)

      本文链接:https://www.haomeiwen.com/subject/kxiqyttx.html