eclipse中没有runtime environments_iOS开发——RunTime总结篇

基础路径图:

af01751d08c03a1946034cb8518416f6.png

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

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

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

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

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

RunTime进阶

进阶路径图:

6f62ad343c4ca0964b0f475aa7e47f63.png

在学习 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应用

应用路径图:

29bb8ce331e5801cccec9ce23dfbe150.png


image

在学习完 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>ble data-draft-node="block" data-draft-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>>ble data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">问题: 给类添加一个属性后,在类结构体里哪些元素会发生变化

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值