iOS runtime method swizzing简单运用

一:最近领导要求看一下项目中的所有sql语句,要统计一下sql, 安卓直接在sqlite的sdk源码里改了,然后导出成文件了,我这边想用分类和runtime,研究了一会成功了,记录一下,大神勿喷。我们项目用的是fcmodel,在调用sql时会走一个方法resultDictionariesFromQuery:....于是在这里runtime替换了方法,并在本地加了一张表,导出,ok


#import "FCModel+LogSql.h"

#import <objc/runtime.h>

@implementation FCModel (LogSql)

+ (void)load{

    // 通过class_getInstanceMethod()函数从当前对象中的method list获取method结构体,如果是类方法就使用class_getClassMethod()函数获取。

    Method fromMethod = class_getClassMethod([self class], @selector(resultDictionariesFromQuery:));

    Method toMethod = class_getClassMethod([self class], @selector(swizzlingResultDictionariesFromQuery:));

    /**,

     *  使用class_addMethod()函数对Method Swizzling做了一层验证,如果self没有实现被交换的方法,会导致失败。

     *  而且self没有交换的方法实现,但是父类有这个方法,这样就会调用父类的方法,结果就不是我们想要的结果了。

     *  通过class_addMethod()的验证,如果self实现了这个方法,class_addMethod()函数将会返回NO,对其进行交换。

     */

    if (!class_addMethod([self class], @selector(swizzlingResultDictionariesFromQuery:), method_getImplementation(toMethod), method_getTypeEncoding(toMethod))) {

        method_exchangeImplementations(fromMethod, toMethod);

    }

}


+ (NSArray *)swizzlingResultDictionariesFromQuery:(NSString *)query {

    NSLog(@"tableName=%@,sql=%@",[self class],query);

    return [self swizzlingResultDictionariesFromQuery:query];

}


- (NSArray *)swizzlingResultDictionariesFromQuery:(NSString *)query {

    NSLog(@"%@",query);

    return [self swizzlingResultDictionariesFromQuery:query];

}


+ (void)swizzlingexpandQuery:(NSString *)query {

    NSLog(@"%@",query);

    return [self swizzlingexpandQuery:query];

}


- (void)swizzlingsave{

    NSLog(@"调用save函数");

     [self swizzlingsave];;

}



@end


//+ (void)load{

//    // 通过class_getInstanceMethod()函数从当前对象中的method list获取method结构体,如果是类方法就使用class_getClassMethod()函数获取。

//    Method fromMethod = class_getInstanceMethod([self class], @selector(expandQuery:));

//    Method toMethod = class_getInstanceMethod([self class], @selector(swizzlingexpandQuery:));

//    /**,

//     *  使用class_addMethod()函数对Method Swizzling做了一层验证,如果self没有实现被交换的方法,会导致失败。

//     *  而且self没有交换的方法实现,但是父类有这个方法,这样就会调用父类的方法,结果就不是我们想要的结果了。

//     *  通过class_addMethod()的验证,如果self实现了这个方法,class_addMethod()函数将会返回NO,对其进行交换。

//     */

//    if (!class_addMethod([self class], @selector(swizzlingexpandQuery:), method_getImplementation(toMethod), method_getTypeEncoding(toMethod))) {

//        method_exchangeImplementations(fromMethod, toMethod);

//    }

//}




二忽然想到之前面试问到的一个问题,给项目中所有的数组加一个判空,其实原理和这个一样,把objectAtIndex替换成自己写的一个方法,然后仅仅在里边判断一下数组个数和index就可以了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值