问题:什么是method swizzling?

作者: 姜小舟 | 来源:发表于2020-08-20 11:41 被阅读0次

    简单说就是进行方法交换。

    在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。

    每个类都有一个方法列表,存放着方法的名字和方法实现的映射关系,selector的本质其实就是方法名,IMP有点类似函数指针,指向具体的Method实现,通过selector就可以找到对应的IMP

    换方法的几种实现方式(其实就是把方法实现进行调换):
    • 利用method_exchangeImplementations交换两个方法的实现
    • 利用class_replaceMethod替换方法的实现
    • 利用method_setImplementation来直接设置某个方法的IMP
      method swizzling

    Method Swizzling 注意事项

    Method Swizzling 是一把双刃剑,使用不当也会给项目带来隐患,这里提一些注意事项:

    1. 尽量在+load方法中(load可以保证被调用,其他方法都不靠谱),并且用 dispatch_once 来确保交换顺序和线程安全
    2. 对于Hook的方法,需要调用原有实现,避免覆盖原有的方法,导致原有的功能缺失
    3. 方法命名推荐使用前缀,避免与原方法名字冲突

    总结

    Method Swizzling 相对于是比较底层的技术,平时开发中使用的不多,但是遇到特定的场景 Method Swizzling 却可以很优雅的解决问题;我们应该掌握 Method Swizzling 的实现原理,避免在项目中滥用,不然会导致很难排查的Bug

    相关文章

      网友评论

        本文标题:问题:什么是method swizzling?

        本文链接:https://www.haomeiwen.com/subject/ndlrjktx.html