RunTime总结:
2024-09-06 18:51:13
oc动态性, 运行时将代码转化为runtime的C代码
RunTime运行流程:
生成对应objc_msgSend方法 isa指针查看当前类有没有这个方法, 之后寻找父类, 每个方法SEL(方法选择器)对应IMP(类似于一个编号,是函数指针,指向函数实现,找到内存里对应函数), 直到NSObeject, 如果找不到IMP, 会进入消息转发机制, resolveClassMethod, resolveInstanceMethod, forwardingTargetForSelector, forwardInvocation 第一个方法所属类方法动态方法解析, 第二个和第一个类似,是对应实例方法的, 第三个是备援接受者, 第四个方法是消息重定向, 真正消息转发,也是Aspects的核心操作, 如果都找不到调用doesNotRecognizeSelector:方法抛出异常
RunTime的实际应用
交换方法(黑魔法.hook,让SEL1->IMP2,SEL2->IMP1),为系统类添加自定义方法,三方Aspects
①用方法交换添加保护, 如数组赋值时添加越界判断等等 ②统计页面点击数用 ③多继承 ④自动化归档(kvo) ⑤NSTime内存泄漏(vc被释放通过消息转发找回vc) ⑥系统类添加自定义方法, 写一些更便捷的代码,比如控件加手势,字典加加密方法,代码更简洁
最新文章
- PHP实现RTX发送消息提醒
- 解决AndroidADT自带Eclipse编辑器不能自动代码提示的问题。
- 模拟Executor策略的实现
- CentOS 6.8下安装MySQL 5.6.33
- Google浏览器导出书签
- python 函数默认值的小坑啊
- hdu 4634 Swipe Bo 搜索
- 知识库系统/知识管理系统 WCP
- Debug编辑通过转Release找不到命名空间
- BuildSigar
- [WP8] Binding时,依照DataType来选择DataTemplate
- input时间输入框小解
- json转javascript对象
- Linux 下安装 MATLAB
- Ubuntu安装jdk,正确配置环境变量
- hadoop环境搭建-伪分布模式
- C#程序集系列13,如何让CLR选择不同版本的程序集
- 简单的网络爬虫程序(Web Crawlers)
- 【转】数据库范式(1NF 2NF 3NF BCNF)
- 在CentOs6.5下安装Python2.7.6和Scrapy