iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理

对比其他库和 Aspects 的优势
使用方法交换的方式和库
增强对运行时方法交换的信心
方法交换流程
安全判断
实现原理
方法交换命名冲突
交换的方法依赖 cmd
被交换的方法必须是当前类的方法
+load 方法中进行方法交换
AOP
Method Swizzling
Runtime
课后作业
小结
更安全的方法交换库 Aspects
直接使用 Runtime 方法交换的风险
原理
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 开发,非常方便地插入切面需求功能。
比如,我在专栏第 9 篇文章中介绍无侵入埋点方案时,就提到了通过 AOP 在不侵入原有功能代码的情况下插入收集埋点的功能。
除此之外,还有一些主业务无关的逻辑功能,也可以通过 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
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • Vicky
    戴老师: “第三个风险是,交换的方法如果依赖了 cmd,那么交换后,如果...”这句话有点不太理解,能做个详细的阐述吗?交换方法在什么情况会依赖cmd?不是特别理解,谢谢~
    2019-05-28
    1
    21
  • daniel
    cmd是指每个函数中都会存在的一个隐藏参数,比如我们想要知道当前函数的名字可以通过在函数内部NSStringFromSelector(_cmd)打印当前函数名字,方法交换后显然原方法的cmd不同了,就跟评论其他人说的差不多,假如原函数有些逻辑是对_cmd进行的,这时候就会出现奇怪的错误。
    2019-07-05
    18
  • Trust me ҉҉҉҉҉҉҉❀
    aspect风险才多 bug也多
    2019-05-28
    9
  • 帅气潇洒的豆子
    问题跟Vicky 朋友一样,我不清楚这里的cmd指的是什么,谢谢
    2019-05-29
    1
    7
  • Usama Bin Laden
    方法交换,都没用过库,都是直接写的。。。
    2019-05-28
    6
  • Realtime
    老师,swift 有 相关功能么? 没有的话,怎么做无侵入埋点呀。苹果为啥把动态功能去掉了,怎么考虑的呀?有相关的替代方法么?
    2019-05-29
    5
  • bart
    @Vicky 我帮你举个栗子 当你在运行时替换某对象中的某函数实现时,如果需要在替换函数中调用原始函数实现,则可以使用cmd。 1.创建新类继承老类实现相同的函数 2.在老类的分类的函数中将被hook的类的isa指向新类(也就是修改了元类) 此时的实例实际上就是新创建子类的实例了 3.所以此时调用实例的函数就会调用子类的函数 4.(可选:在子类中动态获取父类,调用父类的eat函数)就是这步,可以使用cmd。
    2019-06-03
    1
    4
  • 席🍐🍎
    @Vicky 那是指方法内部对cmd做了判断,运行特殊的逻辑,进行swizz之后原方法的cmd会变,可能会导致逻辑错误
    2019-05-28
    3
  • 王万杰
    Aspects性能不如Stinger,是大不如
    2020-03-15
    1
  • Chouee
    原来纯OC开发,Aspect无埋点统计用得66的。自从混编了之后。。。🕳🕳🕳
    2019-05-29
    1
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部