博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你真的懂使用Runtime进行swizzle的最佳写法?
阅读量:6156 次
发布时间:2019-06-21

本文共 1750 字,大约阅读时间需要 5 分钟。

前言

runtime 的黑魔法很多人都一定听过,或者已经在使用了。但是,怎么swizzle方法才是最好呢?

一般写法

Method originalMethod = class_getInstanceMethod(aClass, originalSel);    Method swizzleMethod = class_getInstanceMethod(aClass, swizzleSel);    method_exchangeImplementations(originalMethod, swizzleMethod);

或者是下面这种方式,swizzle第二种写法:

Method originalMethod = class_getInstanceMethod(aClass, originalSel);    Method swizzleMethod = class_getInstanceMethod(aClass, swizzleSel);    BOOL didAddMethod = class_addMethod(aClass, originalSel, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod));    if (didAddMethod) {        class_replaceMethod(aClass, swizzleSel, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));    }else{        method_exchangeImplementations(originalMethod, swizzleMethod);    }

更好写法

其它,这样写,一般不会有问题,但是在一些情况下,比如这个hook的类没有实现你要swizzle的方法,这时是没有swizzle成功的,然后你自己写的 swizzle 里又自己调用自己,就无限循环。

Method originalInsMethod = class_getInstanceMethod(class, originalSelector);    // 处理为实例方法    if (originalInsMethod)    {        method_exchangeImplementations(originalInsMethod, swizzledMethod);    }else{        // 处理为类方法        Method originalClassMethod = class_getClassMethod(class, originalSelector);        if (originalClassMethod)        {            method_exchangeImplementations(originalClassMethod, swizzledMethod);        }else{            // 如果hook的类没有实现这个方法,则先添加方法,然后设置方法的IMP为一个空block。否则直接class_replaceMethod,则方法实则没有交接            class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));            method_setImplementation(swizzledMethod, imp_implementationWithBlock(^(id self, SEL _cmd){}));        }    }

总结

至于这个为什么会更好? 有时间在慢慢说啦~

参考

注:本文首发于 ,如若转载,请注明来源。

你可能感兴趣的文章
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>
雅虎瓦片地图切片问题
查看>>
HTML 邮件链接,超链接发邮件
查看>>
HDU 5524:Subtrees
查看>>
手机端userAgent
查看>>
pip安装Mysql-python报错EnvironmentError: mysql_config not found
查看>>
http协议组成(请求状态码)
查看>>
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
JQuery radio单选框应用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
虚机不能启动的特例思考
查看>>
SQL Server编程系列(1):SMO介绍
查看>>