HOOK一个实例方法和类方法

使用Method Swizzling 方法

swizzling大多时候是在category中的+load方法中使用,也可以创建hook的管理类,放在里面使用。下面例子均在category中进行。

+initialize 方法是在程序调用第一个实例方法/类方法时调用
+load 方法是在初始化时调用

+ (void)load {

          static dispatch_once_t onceToken;
          dispatch_once (&onceToken, ^{

                    Class classA = [self class];

                    SEL originalSelector = @selector (想要替换的实例方法);
                    SEL swizzledSelector = @selector (替换的新方法名) ;

                    Method originalMethod = class_getInstanceMethod (classA, originalSelector);
                    Method swizzlingMethod = class_getInstanceMethod (classA, swizzledSelector);

                    //如果替换的是类方法
                    Class classB = Object_getClass ((id) self);

                    SEL originalSelector = @selector (想要替换的类方法);
                    SEL swizzledSelector = @selector (替换的新方法名) ;

                    Method originalMethod = class_getClassMethod (classB, originalSelector);
                    Method swizzlingMethod = class_getClassMethod (classB, swizzledSelector);

                    //在交换方法之前要先判断将要替换的方法是否存在
                    Bool isExist = class_addMethod (classA, originalSelector, method_getImplementation (swizzlingMethod), method_getTypeEncoding (swizzlingMethod));

                    //实现方法交换
                    if (isExist) {
                         class_replaceMethod (classA, swizzledMethod, method_getImplementation (swizzlingMethod), method_getTypeEncode (swizzlingMethod));

                    } else {
                         method_exchangeImplementations (originMethod, swizzlingMethod);
                    }

          });
}

category是专门用来添加方法的,如果添加属性系统不会自动生成getter,setter方法,这时需要我们自己手动添加。

1,  在setter方法中:objc_setAssociatedObject
2, 在getter方法中:objc_getAssociatedObject
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值