方法替换:-实现拦截功能
来源:互联网 发布:java实现语音聊天 编辑:程序博客网 时间:2024/05/02 18:11
顾名思义,就用一个方法替换一个方法的意思:
直接上代码,我自己看英文,也不翻译了,想了解的可以去看文档
点击这里直接看英文文档 另外还有好多其他的扩展
在方法替换的过程中,我们可以用分类扩展方法来替换,也可以在本类方法之间的替换
首先声明交换方法
当然我们也有自己的方法来实现交换:
void Swizzle(Class c, SEL orig, SEL _new)
{
MethodorigMethod = class_getInstanceMethod(c, orig);
MethodnewMethod = class_getInstanceMethod(c, _new);
if(class_addMethod(c, orig, method_getImplementation(newMethod),method_getTypeEncoding(newMethod)))
class_replaceMethod(c, _new, method_getImplementation(origMethod),method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
在工程中,经常使用方法拦截之后(方法替换)之后,我们再次把方法替换回来,为了不影响其他模块使用这个系统功能。
可以定义成一个宏:
#define METHODCALLBACK(taget){\
NSString *__Name=NSStringFromSelector(_cmd);\
NSString *_selectorName=[@"__Inv_"stringByAppendingString:__Name];\
Swizzle([self class], NSSelectorFromString(_selectorName),NSSelectorFromString(__Name));\
taget;\
Swizzle([self class], NSSelectorFromString(__Name),NSSelectorFromString(_selectorName));\
}
原型是:
METHODCALLBACK(taget){
NSString *__Name=NSStringFromSelector(_cmd);
NSString *_selectorName=[@"__Inv_"stringByAppendingString:__Name];
Swizzle([self class], NSSelectorFromString(_selectorName),NSSelectorFromString(__Name));
taget;
Swizzle([self class], NSSelectorFromString(__Name),NSSelectorFromString(_selectorName));
}
直接上代码,我自己看英文,也不翻译了,想了解的可以去看文档
点击这里直接看英文文档
在方法替换的过程中,我们可以用分类扩展方法来替换,也可以在本类方法之间的替换
首先声明交换方法
#import </usr/include/objc/objc-class.h>
Void MethodSwizzle(Class aClass, SEL orig_sel, SEL alt_sel)实现功能:voidMethodSwizzle (Class aClass, SEL orig_sel, SEL alt_sel){ Method orig_method = nil, alt_method = nil; // First, look for the methods orig_method = class_getInstanceMethod(aClass, orig_sel); alt_method = class_getInstanceMethod(aClass, alt_sel); // If both are found, swizzle them if ((orig_method != nil) && (alt_method != nil)) { char *temp1; IMP temp2; temp1 = orig_method->method_types; orig_method->method_types = alt_method->method_types; alt_method->method_types = temp1; temp2 = orig_method->method_imp; orig_method->method_imp = alt_method->method_imp; alt_method->method_imp = temp2; }}
当然我们也有自己的方法来实现交换:
void Swizzle(Class c, SEL orig, SEL _new)
{
}
在工程中,经常使用方法拦截之后(方法替换)之后,我们再次把方法替换回来,为了不影响其他模块使用这个系统功能。
可以定义成一个宏:
#define METHODCALLBACK(taget){\
NSString *__Name=NSStringFromSelector(_cmd);\
NSString *_selectorName=[@"__Inv_"stringByAppendingString:__Name];\
Swizzle([self class], NSSelectorFromString(_selectorName),NSSelectorFromString(__Name));\
taget;\
Swizzle([self class], NSSelectorFromString(__Name),NSSelectorFromString(_selectorName));\
}
原型是:
METHODCALLBACK(taget){
NSString *__Name=NSStringFromSelector(_cmd);
NSString *_selectorName=[@"__Inv_"stringByAppendingString:__Name];
Swizzle([self class], NSSelectorFromString(_selectorName),NSSelectorFromString(__Name));
taget;
Swizzle([self class], NSSelectorFromString(__Name),NSSelectorFromString(_selectorName));
}
- 方法替换:-实现拦截功能
- Android设计模式之动态代理,实现方法拦截功能
- Java实现查找替换功能
- runtime 方法替换实现
- android之垃圾短信拦截功能实现
- 关于Struts2实现简单权限拦截功能
- MyBatis 拦截器 (实现分页功能)
- MyBatis实现拦截器分页功能
- MyBatis拦截器实现分页功能
- spring mvc实现HandlerInterceptor完成拦截功能
- 使用AOP拦截注解实现功能
- javascript操作word实现替换功能
- std::string实现全部替换功能
- 用C语言实现字符串替换功能
- C++实现的文本字符串替换功能
- 用C语言实现字符串替换功能
- 读取txt文件实现搜索替换功能
- 利用正则实现简单模板替换功能
- 大道至简:透过现象看本质
- struts2.0中struts.xml配置文件详解
- 2012最新ANDROID框架源码下载方法
- SVN子命令add用法浅析
- 优秀程序员的十个习惯
- 方法替换:-实现拦截功能
- ppt幻灯片使用技巧
- android 拷贝Sqlite数据库不成功,则出现空问题
- RTP/RTCP
- http上传大文件时OOM问题
- 用rpm打包软件(一)
- 正则表达式语句大全
- shell知识
- 初窥BlueStacks