详细示例代码github仓库总结:NIiOS
```
001-iOS 开发:『Runtime』详解(一)基础知识 见:有道云笔记、总结思维导图
应用案例:-proj_2020/006Runtime
002-iOS 开发:『Runtime』详解(二)Method Swizzling(动态方法交换) 见:有道云笔记、总结思维导图
应用案例:-NIiOS_GitHub/proj_2020/024YSC-Runtime-MethodSwizzling/Runtime-MethodSwizzling02
Runtime运行时系统中最具争议的黑魔法:Method Swizzling(动态方法交换) Method Swizzling四种方案:
- [x] D:优秀的第三方框架:JRSwizzle 和 RSSwizzle
- [x] C:在其他类中添加 Method Swizzling 交换方法
- [x] B:在该类的分类中添加 Method Swizzling 交换方法,但是使用函数指针的方式。
- [x] A:在该类的分类中添加 Method Swizzling 交换方法,用普通方式
Method Swizzling应用场景:(工具类待总结进入 NITools by:nixs 2020年11月23日)
- [x] 5.APM(应用性能管理)、防止程序崩溃
- [x] 4.TableView、CollectionView 异常加载占位图
- [x] 3.处理按钮重复点击
- [x] 2.字体根据屏幕尺寸适配
- [x] 1.全局页面统计功能
003-iOS 开发:『Runtime』详解(三)Category 底层原理 见:有道云笔记、总结思维导图
004-iOS 开发:『Runtime』详解(四)获取类详细属性、方法
--- 在ios 13之后,UITextField禁止通过KVC修改属性,以下提供两种方式(参考:https://blog.csdn.net/Harvey_DHui/article/details/105167550)
- 注:026YSC-Class-DetailList-Demo已经有实现,解决方案如下
解决方式1:通过attributedPlaceholder属性修改Placeholder颜色
解决方式2:为UITextField重新写一个方法
---***--- 万能控制器跳转-为路由跳转做准备
- 注:026YSC-Class-DetailList-Demo已经有实现,解决方案如下
* 需求:
1.某个页面的不同 banner 图,点击可以跳转到不同页面。
2.推送通知,点击跳转到指定页面。
3.二维码扫描,根据不同内容,跳转不同页面。
4.WebView 页面,根据 URL 点击不同,跳转不同的原生页面。
...
* 分析:先来思考一下几种解决方法。
方法 1:在每个需要跳转的地方写一堆判断语句以及跳转语句。
方法 2:将判断语句和跳转语句抽取出来,写到基类,或者对应的 Category 中。
方法 3:利用 Runtime,定制一个万能跳转控制器工具。
* 实现步骤:
1.事先和服务器端商量好,定义跳转不同控制器的规则,让服务器传回对应规则的相关参数。
比如:跳转到 A 控制器,需要服务器传回 A 控制器的类名,控制器 A 需要传入的属性参数(id、type 等等)。
2.根据服务器传回的类名,创建对应的控制器对象;
3.遍历服务器传回的参数,利用 Runtime 遍历控制器对象的属性列表;
4.如果控制器对象存在该属性,则利用 KVC 进行赋值;
5.进行跳转。
--- 实现字典转模型(注:可以去看下MJExtension的源码对比学习下)
1.在日常开发中,将网络请求中获取的 JSON 数据转为数据模型,是我们开发中必不可少的操作。通常我们会选用诸如 YYModel、JSONModel 或者 MJExtension 等第三方框架来实现这一过程。这些框架实现原理的核心就是 Runtime 和 KVC,以及 Getter / Setter。
2.实现的大体思路如下:借助 Runtime 可以动态获取成员列表的特性,遍历模型中所有属性,然后以获取到的属性名为 key,在 JSON 字典中寻找对应的值 value;再使用 KVC 或直接调用 Getter / Setter 将每一个对应 value 赋值给模型,就完成了字典转模型的目的。
3.字典中取值除了字符串之外,还有数组和字典。那么在将字典转换成数据模型的时候,就要考虑 模型嵌套模型、模型嵌套模型数组 的情况了
4.// 对特殊属性进行处理
// 判断当前类是否实现了协议方法,获取协议方法中规定的特殊属性的处理方式
// 处理:字典的 key 与模型属性不匹配的问题,如 id -> uid
005-iOS 开发:『Runtime』详解(五)Crash 防护系统(Runtime消息转发:消息动态解析、消息接收者重定向、消息重定向)
通过 Runtime 机制可以避免的常见 Crash :
1.unrecognized selector sent to instance(找不到对象方法的实现)
2.unrecognized selector sent to class(找不到类方法实现)
3.KVO Crash
4.KVC Crash
5.NSNotification Crash
6.NSTimer Crash
7.Container Crash(集合类操作造成的崩溃,例如数组越界,插入 nil 等)
8.NSString Crash (字符串类操作造成的崩溃)
9.Bad Access Crash (野指针)
10.Threading Crash (非主线程刷 UI)
11.NSNull Crash
iOS 开发:『Crash 防护系统』(一)Unrecognized Selector
通过本文,您将了解到:
Crash 防护系统开篇
防护原理简介和常见 Crash
Method Swizzling 方法的封装
Unrecognized Selector 防护
4.1 unrecognized selector sent to instance(找不到对象方法的实现)
4.2 unrecognized selector sent to class(找不到类方法实现)
iOS 开发:『Crash 防护系统』(二)KVO 防护(针对Crash防护的学习,一定要明白Bugly到底做了什么!!!,出现了异常是怎么上送到异常管理后台的?)
KVO 日常使用造成崩溃的原因通常有以下几个:
1.KVO 添加次数和移除次数不匹配:
*移除了未注册的观察者,导致崩溃。
*重复移除多次,移除次数多于添加次数,导致崩溃。
*重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。
2.被观察者提前被释放,被观察者在 dealloc 时仍然注册着 KVO,导致崩溃。
例如:被观察者是局部变量的情况(iOS 10 及之前会崩溃)。
3.添加了观察者,但未实现 observeValueForKeyPath:ofObject:change:context: 方法,导致崩溃。
4.添加或者移除时 keypath == nil,导致崩溃。
iOS 开发:『Crash 防护系统』(三)KVC 防护
1.KVC Crash 的主要原因
2.KVC 搜索模式
3.KVC Crash 防护方案
KVC 日常使用造成崩溃的原因通常有以下几个:
1.key 不是对象的属性,造成崩溃。
2.keyPath 不正确,造成崩溃。
3.key 为 nil,造成崩溃。
4.value 为 nil,为非对象设值,造成崩溃。
```