我们团队做了个小的科研型项目,用来保护iOS开发工程中的疏忽引起崩溃的情况。
使用简单,import头文件,在appdelegate中加一句代码即可。
目前只是基本常见情况的处理。希望可以帮助到大家,也希望高手们吐槽指正提出意见。
解决方案放在git上开源了:https://github.com/vipshop/VDM/tree/master
防止崩溃:
1、UIControl依赖的target对象被释放,UIControl继续响应设置给target的selector函数导致的crash
2、UITableView依赖的delegate、datasource对象被释放后,UITableView继续响应delegate和datasource函数导致的crash
3、UIScrollView依赖的delegate的对象被释放后,UIScrollView继续响应delegate函数导致的crash
4、UIPickView依赖的delegate、datasource对象被释放后,UITableView继续响应delegate和datasource函数导致的crash
5、UIGestureRecognizer依赖的target对象被释放后,UIGestureRecognizer继续响应设置给target的selector函数导致的crash
6、NSNotificationCenter向已经被释放的对象发送消息导致的crash
7、KVO的观察者observer被释放后value变化导致的crash
8、已释放对象调用延迟操作导致的crash
9、NSTimer的target对象被释放后,定时任务执行导致的crash
10、添加KVO重复添加观察者或重复移除观察者(KVO注册观察者与移除观察者不匹配)导致的crash
实现原理:
1、创建dependencyManager单例管理依赖工具
2、category系统的有依赖属性的对象,如:UIControl、UIScrollView、UITableView、UIPickerView、UIGestureRecognizer,NSTimer 在这些对象创建依赖时,将依赖关系以key-value的形式保存到我们的dependencyManager的单例中去
3、category IOS中被依赖的对象UIVIew、UIViewController,当被依赖对象释放时,dependencyManager讲与之关联的依赖控件或手势、通知移除。