一:最近领导要求看一下项目中的所有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就可以了。