iOS开发 Method Swizzling 方法替换

关于Method Swizzling,有位大神介绍的很详细了,地址:Objective-C的hook方案(一): Method Swizzling

其实呢,菜逼一个的我不怎么懂,就把我项目中用到的贴上来吧:

代码:(写在NSObject的类别里 需要引入#import <objc/runtime.h>)

@implementation NSObject (Swizzle)

+ (void)swizzleMethod:(SEL)srcSel tarSel:(SEL)tarSel {
  Class clazz = [self class];
  [self swizzleMethod:clazz srcSel:srcSel tarClass:clazz tarSel:tarSel];
}

+ (void)swizzleMethod:(SEL)srcSel tarClass:(NSString *)tarClassName tarSel:(SEL)tarSel {
  if (!tarClassName) {
    return;
  }
  Class srcClass = [self class];
  Class tarClass = NSClassFromString(tarClassName);
  [self swizzleMethod:srcClass srcSel:srcSel tarClass:tarClass tarSel:tarSel];
}

+ (void)swizzleMethod:(Class)srcClass srcSel:(SEL)srcSel tarClass:(Class)tarClass tarSel:(SEL)tarSel {
  if (!srcClass) {
    return;
  }
  if (!srcSel) {
    return;
  }
  if (!tarClass) {
    return;
  }
  if (!tarSel) {
    return;
  }
  
  XSD_TRY_BODY(Method srcMethod = class_getInstanceMethod(srcClass,srcSel);
               Method tarMethod = class_getInstanceMethod(tarClass,tarSel);
               method_exchangeImplementations(srcMethod, tarMethod);)
  
}

@end

其中的宏定义:

#define XSD_TRY_BODY(__target) \
@try {\
{__target}\
}\
@catch (NSException *exception) {\
 NSLog(@"exception ===== %@", [exception description]);\
}\
@finally {\
\
}

用法:

#import "MWPhotoBrowser+XSDExt.h"

@implementation MWPhotoBrowser (XSDExt)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleMethod:@selector(_toggleControls) tarSel:@selector(toggleControls)];
    });
}

- (void)_toggleControls {
    [self.navigationController popViewControllerAnimated:YES];
}

@end

我这是用到了一个浏览图片的第三方库,想改其中的一个方法,直接写了一个方法,在load方法里写了替换的方法;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值