基础路径图:
在学习 RunTime
的基础时, 我们要搞清楚一些重要的东西, 一些专业术语:
- SEL
- id
- Class
- Method
- Ivar
- IMP
- Cache
- Property
我们可以从这些东西里获取到指定类的所有信息, 无论是公开的, 还是私有的, 全部都可以拿到, 并且操作.
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
PS: 但操作私有方法的时候, 注意不要用来上架, 除非你有方法让苹果审核的时候通过.
RunTime进阶
进阶路径图:
在学习 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应用
应用路径图:
image
在学习完 RunTime
之后, 我们就可以应用到我们的实际开发中.
Category
- 关联对象
- 控制对象
Class
- 动态添加方法
- 动态交换方法
- 动态拦截并替换方法
- 动态给方法添加额外功能
Model
- 自动归档和解档
- 自动字典转模型
- 字典转模型(模型属性数量大于字典key数量)
- 字典转模型(模型中嵌套模型)
- 字典转模型(数组中嵌套模型)
RunTime实例开发场景
在实际开发中, 我们有一些实例场景会用到 RunTime
:
- 替换
ViewController
的声明周期 - 解决集合类因索引的问题崩溃的问题
- 防止按钮重复高强度点击
- 全局更换控件初始效果
- App热修复
- App异常加载的展位图
- 全局修改
UINavigationBar
的backButtonItem
Runtime Method Swizzling开发实例汇总
RunTime面试题及答案
ble data-draft-node="block" data-dr
aft-type="t
able" data-size="normal"
data-row-style="normal">问题: objc在向一个对象发送
消息时, 发生了什么?r>od
y></ta
ble>ble data-draft-node="block" d
ata-draf
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-dra
ft-type="table" data-
size="normal"
data-row-s
tyle="normal">body>问
题: runtime如何实
现weak变量的自动置
nil?r>>ble data-draft-node="block" data-draft-typ
e="table" data-size="normal" data-
row-style="normal">问题: 给类添加一个属性后,在类结构体里哪些元素会发生变化
总结
好了, 终于到尾声了, 希望大家可以在我的文章里学到知识, 早日迎娶白富美, 走上人生巅峰,