iOS开发——RunTime总结篇

466 阅读3分钟

点赞再看,养成习惯,
白嫖不好,欢迎大家关注我面试小专栏 : iOS中高级进阶之路 有我准备的一线大厂面试资料和简历模板,欢迎Star!

基础路径图:

在学习 RunTime 的基础时, 我们要搞清楚一些重要的东西, 一些专业术语:

  • SEL
  • id
  • Class
  • Method
  • Ivar
  • IMP
  • Cache
  • Property

我们可以从这些东西里获取到指定类的所有信息, 无论是公开的, 还是私有的, 全部都可以拿到, 并且操作.

PS: 但操作私有方法的时候, 注意不要用来上架, 除非你有方法让苹果审核的时候通过.

RunTime进阶

进阶路径图:

![](https://pic4.zhimg.com/80/v2-b1188c64850a46e83ed51e8a7a344f0a_720w.jpg)

在学习 RunTime 进阶的时候, 我们就要了解更加的深入.

消息机制:

  • objc_msgSend
  • objc_msgSend_fpret
  • objc_msgSend_stret
  • objc_msgSendSuper
  • objc_msgSendSuper_stret

对象关联:

  • objc_setAssociatedObject()
  • objc_getAssociatedObject()
  • objc_removeAssociatedObjects()

对象关联的策略:

  • OBJC_ASSOCIATION_ASSIGN
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC
  • OBJC_ASSOCIATION_COPY_NONATOMIC
  • OBJC_ASSOCIATION_RETAIN
  • OBJC_ASSOCIATION_COPY

动态方法解析:

  • resolveInstanceMethod:

  • YES , 通过 class_addMethod 消息得到处理, 结束

  • NO , 进入 forwardingTargetForSelector

  • 指定响应 selector , 消息得到处理, 结束

  • 不指定响应 selector

  • 进入 methodSignatureForSelector , 指定方法签名, 调用 forwardInvovation , 通过 anInvocation 做处理, 消息得到处理, 结束

  • 不指定方法签名, 该消息没有得到处理, 系统报错

RunTime应用

应用路径图:

![](https://pic4.zhimg.com/80/v2-330118dc1486b1dce880cfde0359c03e_720w.jpg)

在学习完 RunTime 之后, 我们就可以应用到我们的实际开发中.

Category

  • 关联对象
  • 控制对象

Class

  • 动态添加方法
  • 动态交换方法
  • 动态拦截并替换方法
  • 动态给方法添加额外功能

Model

  • 自动归档和解档

  • 自动字典转模型

  • 字典转模型(模型属性数量大于字典key数量)

  • 字典转模型(模型中嵌套模型)

  • 字典转模型(数组中嵌套模型)

RunTime实例开发场景

在实际开发中, 我们有一些实例场景会用到 RunTime :

  • 替换 ViewController 的声明周期
  • 解决集合类因索引的问题崩溃的问题
  • 防止按钮重复高强度点击
  • 全局更换控件初始效果
  • App热修复
  • App异常加载的展位图
  • 全局修改 UINavigationBarbackButtonItem

Runtime Method Swizzling开发实例汇总

RunTime面试题及答案

ble data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">问题: objc在向一个对象发送消息时, 发生了什么?r>ody></table>**b**le dat**a**-draft-node="block" d**a**ta-**d**raf**t**-type="table"** data-size="normal" data-row-style="normal">ody>问题: 什么时候会报 unrecognized selector 错误? iOS 有哪些机制来避免走到这一步?**able>ble data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">body>r>问题: 能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量? 为什么?tbody></table>ble data-draft-node="block**" data-draft-type="table" data-size="normal" data-row-style="normal">body>题: runtime如何实现weak变量的自动置nil?r>>**b**le data-draft-node="block**" data-draft-type="table" data-size="normal" data-row-style="normal">问题: 给类添加一个属性后,在类结构体里哪些元素会发生变化********

总结

好了, 终于到尾声了, 希望大家可以在我的文章里学到知识, 早日迎娶白富美, 走上人生巅峰, 

感谢支持!文章持续更新  点赞再看,养成习惯,
白嫖不好,欢迎大家关注我面试小专栏 : iOS中高级进阶之路 有我准备的一线大厂面试资料和简历模板,欢迎Star!