我們團隊做了個小的科研型項目,用來保護iOS開發(fā)工程中的疏忽引起崩潰的情況。
使用簡單,import頭文件,在appdelegate中加一句代碼即可。
目前只是基本常見情況的處理。希望可以幫助到大家,也希望高手們吐槽指正提出意見。
解決方案放在git上開源了:https://github.com/vipshop/VDM/tree/master
防止崩潰:
1、UIControl依賴的target對象被釋放,UIControl繼續(xù)響應設置給target的selector函數(shù)導致的crash
2、UITableView依賴的delegate、datasource對象被釋放后,UITableView繼續(xù)響應delegate和datasource函數(shù)導致的crash
3、UIScrollView依賴的delegate的對象被釋放后,UIScrollView繼續(xù)響應delegate函數(shù)導致的crash
4、UIPickView依賴的delegate、datasource對象被釋放后,UITableView繼續(xù)響應delegate和datasource函數(shù)導致的crash
5、UIGestureRecognizer依賴的target對象被釋放后,UIGestureRecognizer繼續(xù)響應設置給target的selector函數(shù)導致的crash
6、NSNotificationCenter向已經(jīng)被釋放的對象發(fā)送消息導致的crash
7、KVO的觀察者observer被釋放后value變化導致的crash
8、已釋放對象調(diào)用延遲操作導致的crash
9、NSTimer的target對象被釋放后,定時任務執(zhí)行導致的crash
10、添加KVO重復添加觀察者或重復移除觀察者(KVO注冊觀察者與移除觀察者不匹配)導致的crash
實現(xiàn)原理:
1、創(chuàng)建dependencyManager單例管理依賴工具
2、category系統(tǒng)的有依賴屬性的對象,如:UIControl、UIScrollView、UITableView、UIPickerView、UIGestureRecognizer,NSTimer 在這些對象創(chuàng)建依賴時,將依賴關系以key-value的形式保存到我們的dependencyManager的單例中去
3、category IOS中被依賴的對象UIVIew、UIViewController,當被依賴對象釋放時,dependencyManager講與之關聯(lián)的依賴控件或手勢、通知移除。