现在遇到json数据解析,服务器有可能给nil、null、@”“等,用objectForKey取出来是可以为nil等上述类型,不会报错,但是用的时候GG思密达了,而且以前自己没有类型判断完整,这时候不想去挨个挨个的改,hook大法再次登场
@implementation NSDictionary (runtimeObjectForKey)
+ (void) load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
// 选择器
SEL originalSEL = @selector(objectForKey:);//@selector(objectForKey:);
SEL SwizzledSEL = @selector(hObjectForKey:);
//方法 使用NSDictionary、NSArray,必须使用与其对应的加入内存时的元类__NSDictionaryI __NSArrayI
// __NSDictionaryI——NSDictionary __NSDictionaryM——NSMutableDictionary
// __NSArrayI——NSArray __NSArrayM——NSMutableArray
Method originalMethod = class_getInstanceMethod(NSClassFromString(@"__NSDictionaryI"), originalSEL);//class_getClassMethod(class, originalSEL);备注的是获取静态方法
Method SwizzledMethod = class_getInstanceMethod(NSClassFromString(@"__NSDictionaryI"), SwizzledSEL);//class_getClassMethod(class, SwizzledSEL);
// 方法的实现
IMP originalIMP = method_getImplementation(originalMethod);//class_getMethodImplementation(class, originalSEL);
IMP SwizzledIMP = method_getImplementation(SwizzledMethod);//class_getMethodImplementation(class, SwizzledSEL);
// 是否添加成功方法:添加了初始方法,实现内容指向目标方法体
BOOL isSuccess = class_addMethod(class, originalSEL, SwizzledIMP, method_getTypeEncoding(SwizzledMethod));
if (isSuccess) {
// 初始指向目标,那么把目标的内容指向初始
class_replaceMethod(class, SwizzledSEL, originalIMP, method_getTypeEncoding(originalMethod));
}
else{
// 没有添加成功说明已经存在,就交换
// 注意,这里交换的是IMP 实现
method_exchangeImplementations(originalMethod, SwizzledMethod);
}
});
}
- (id)hObjectForKey:(id)aKey{
}
@end