34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
戴铭
该思维导图由 AI 生成,仅供参考
你好,我是戴铭。
提到 Object-C 中的 Runtime,你可能一下就想到了 iOS 的黑魔法 Method Swizzling。毕竟,这个黑魔法可以帮助我们在运行时进行方法交换,或者在原方法执行之前插入自定义方法,以保证在业务面向对象编程方式不被改变的情况下,进行切面功能的开发。但是,运行时进行方法交换同时也会带来一定的风险。所以,今天我就来和你详细聊聊 Runtime Method Swizzling 的原理。
Runtime Method Swizzling 编程方式,也可以叫作 AOP(Aspect-Oriented Programming,面向切面编程)。
AOP 是一种编程范式,也可以说是一种编程思想,使用 AOP 可以解决 OOP(Object Oriented Programming,面向对象编程)由于切面需求导致单一职责被破坏的问题。通过 AOP 可以不侵入 OOP 开发,非常方便地插入切面需求功能。
除此之外,还有一些主业务无关的逻辑功能,也可以通过 AOP 来完成,这样主业务逻辑就能够满足 OOP 单一职责的要求。而如果没有使用 AOP,鉴于 OOP 的局限性,这些与主业务无关的代码就会到处都是,增大了工作量不说,还会加大维护成本。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
iOS黑魔法Runtime Method Swizzling背后的原理 本文深入探讨了iOS中Runtime Method Swizzling的原理及其潜在风险,并介绍了更安全的方法交换库Aspects。Runtime Method Swizzling作为一种AOP编程方式,能够在运行时进行方法交换或在原方法执行之前插入自定义方法,实现切面功能的开发。然而,直接使用Runtime进行方法交换存在一定风险,例如在+load方法中进行方法交换、父类方法无法直接交换等。相比之下,Aspects作为更安全的方法交换库,通过消息转发机制实现方法交换,并处理了一些可能引发风险的情况。文章还详细介绍了Aspects的实现原理,包括安全判断和方法交换的流程。通过学习Aspects的源码,读者可以了解如何处理方法交换可能引发的风险。总的来说,本文通过介绍Runtime Method Swizzling的原理和Aspects的使用,帮助读者更好地理解方法交换的风险和安全实现方式。 在文章中,作者梳理了直接使用Runtime进行方法交换可能存在的问题,并分享了更安全的方法交换库Aspects。最后,作者鼓励读者了解更多运行时原理和优秀方法交换库的实现细节,以增强对运行时方法交换的信心,从而更高效地解决问题。通过这篇文章,读者能够深入了解方法交换的技术特点,以及如何选择更安全的方法交换方式。 总的来说,本文对iOS黑魔法Runtime Method Swizzling进行了深入剖析,为读者提供了全面的技术视角和安全实现方式。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》,新⼈⾸单¥59
《iOS 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(20)
- 最新
- 精选
- Vicky戴老师: “第三个风险是,交换的方法如果依赖了 cmd,那么交换后,如果...”这句话有点不太理解,能做个详细的阐述吗?交换方法在什么情况会依赖cmd?不是特别理解,谢谢~2019-05-28121
- danielcmd是指每个函数中都会存在的一个隐藏参数,比如我们想要知道当前函数的名字可以通过在函数内部NSStringFromSelector(_cmd)打印当前函数名字,方法交换后显然原方法的cmd不同了,就跟评论其他人说的差不多,假如原函数有些逻辑是对_cmd进行的,这时候就会出现奇怪的错误。2019-07-0518
- Trust me ҉҉҉҉҉҉҉❀aspect风险才多 bug也多2019-05-289
- 帅气潇洒的豆子问题跟Vicky 朋友一样,我不清楚这里的cmd指的是什么,谢谢2019-05-2917
- Usama Bin Laden方法交换,都没用过库,都是直接写的。。。2019-05-286
- Realtime老师,swift 有 相关功能么? 没有的话,怎么做无侵入埋点呀。苹果为啥把动态功能去掉了,怎么考虑的呀?有相关的替代方法么?2019-05-295
- bart@Vicky 我帮你举个栗子 当你在运行时替换某对象中的某函数实现时,如果需要在替换函数中调用原始函数实现,则可以使用cmd。 1.创建新类继承老类实现相同的函数 2.在老类的分类的函数中将被hook的类的isa指向新类(也就是修改了元类) 此时的实例实际上就是新创建子类的实例了 3.所以此时调用实例的函数就会调用子类的函数 4.(可选:在子类中动态获取父类,调用父类的eat函数)就是这步,可以使用cmd。2019-06-0314
- 席🍐🍎@Vicky 那是指方法内部对cmd做了判断,运行特殊的逻辑,进行swizz之后原方法的cmd会变,可能会导致逻辑错误2019-05-283
- 王万杰Aspects性能不如Stinger,是大不如2020-03-151
- Chouee原来纯OC开发,Aspect无埋点统计用得66的。自从混编了之后。。。🕳🕳🕳2019-05-291
收起评论