一、前沿
本人是「知识」的「实用主义者」,只学习“有用”的知识。这个“有用”如何理解呢?首先自己感兴趣的,精神上得到满足;然后,对于工作有用;最好,对于现阶段人生规划和职业规划有用。
原因很简单,本人记忆力不好,记不了太多东西,不常用的总是会不经意间忘了。再者,个人精力和时间有限,特别是建立了家庭,有了小孩,然后年龄一年年大了之后,更是如此。
话说回来,本篇主旨是汇总Runtime的一些使用场景以便后续查阅
二、Runtime的使用场景
1、方法交换,即[Method Swizzling]
-
AOP编程
-
用户埋点统,如页面事件等
交换viewWillAppear:
等方法,实现控制器生命周期检测,进而实现埋点。 -
字体根据屏幕尺寸适配(所有的控件字体必须依据屏幕的尺寸等比缩放。)
交换systemFontOfSize:
方法,统一修改 -
处理按钮或者手势的重复点击
交换sendAction:to:forEvent:
方法,里面保存上一次点击时间,做频控。 -
TableView、CollectionView 异常加载占位图
交换reloadData
方法,里面做判空处理。 -
按钮点击区域太小问题
-
APM(应用性能管理)
通过 Method Swizzling 替换NSURLConnection
,NSURLSession
相关的原始实现(例如NSURLConnection
的构造方法和 start 方法),在实现中加入网络性能埋点行为,然后调用原始实现。从而来监控网络。
New Relic:https://newrelic.com
听云 APM:https://www.tingyun.com
NetEaseAPM:http://apm.netease.com/
ONE APM:https://www.oneapm.com/ -
防止程序崩溃
拦截容易造成崩溃的系统方法,然后在替换方法捕获异常类型 NSException ,再对异常进行处理。
如,NSArray的越界操作方法、NSString的空导致crash、UIImage空异常等等。GitHub:chenfanfang / AvoidCrash
GitHub:ValiantCat / XXShield
2、Category类别动态添加属性
3、为某个实例或者对象动态添加方法
4、未识别方法名Crash的处理
降低Crash的一个处理方式。
5、自动归档和解档(NSCoding )
6、数据与模型的ORM方案
本人最喜欢Runtime的原因之一,大大提高开发效率,想想没有ORM方案的黑暗年代。
7、私有库的私有属性或者私有方法
不建议,经常导致一些不可预知的问题,可能为未来埋大坑。
8、实现多继承
强烈不推荐使用,多继承增加很大的复杂性,给维护造成很多困难。另一方面,多继承解决的问题,都可以通过协议编程和面向接口编程解决。现在很多主流语言都是单继承的。
请即避免多继承!!!
9、热修复
例如JSPatch
替换已有的OC方法实行等。
关于热修复爱的人在于能及时解决线上问题,不至于重新发包。不过现在Apple给毙了,没话说,毕竟动了蛋糕了。
10、MJRefresh的封装
为UITableView\UICollectionView\UIScrollView等统计增加下拉上拉机制。
11、主题切换或者换肤
- 方案一:为所有的资源(image、video、gif、color、font、font-sizt等)定义统一唯一key,然后config配置文件统一切换。
- 利用动态方法调用NSInvocation,替换某个类的颜色或者图片。
- 利用方法替换,将某个资源或者字体颜色换成其他颜色。
iOS通用换肤解决方案
网友评论