我們團(tuán)隊(duì)做了個(gè)小的科研型項(xiàng)目隙笆,用來保護(hù)iOS開發(fā)工程中的疏忽引起崩潰的情況魏保。
使用簡單鲜侥,import頭文件天揖,在appdelegate中加一句代碼即可夺欲。
目前只是基本常見情況的處理。希望可以幫助到大家今膊,也希望高手們吐槽指正提出意見些阅。
解決方案放在git上開源了:https://github.com/vipshop/VDM/tree/master
防止崩潰:
1、UIControl依賴的target對象被釋放斑唬,UIControl繼續(xù)響應(yīng)設(shè)置給target的selector函數(shù)導(dǎo)致的crash
2市埋、UITableView依賴的delegate黎泣、datasource對象被釋放后,UITableView繼續(xù)響應(yīng)delegate和datasource函數(shù)導(dǎo)致的crash
3缤谎、UIScrollView依賴的delegate的對象被釋放后抒倚,UIScrollView繼續(xù)響應(yīng)delegate函數(shù)導(dǎo)致的crash
4、UIPickView依賴的delegate坷澡、datasource對象被釋放后托呕,UITableView繼續(xù)響應(yīng)delegate和datasource函數(shù)導(dǎo)致的crash
5、UIGestureRecognizer依賴的target對象被釋放后频敛,UIGestureRecognizer繼續(xù)響應(yīng)設(shè)置給target的selector函數(shù)導(dǎo)致的crash
6项郊、NSNotificationCenter向已經(jīng)被釋放的對象發(fā)送消息導(dǎo)致的crash
7、KVO的觀察者observer被釋放后value變化導(dǎo)致的crash
8姻政、已釋放對象調(diào)用延遲操作導(dǎo)致的crash
9呆抑、NSTimer的target對象被釋放后,定時(shí)任務(wù)執(zhí)行導(dǎo)致的crash
10汁展、添加KVO重復(fù)添加觀察者或重復(fù)移除觀察者(KVO注冊觀察者與移除觀察者不匹配)導(dǎo)致的crash
實(shí)現(xiàn)原理:
1鹊碍、創(chuàng)建dependencyManager單例管理依賴工具
2、category系統(tǒng)的有依賴屬性的對象食绿,如:UIControl侈咕、UIScrollView、UITableView器紧、UIPickerView耀销、UIGestureRecognizer,NSTimer 在這些對象創(chuàng)建依賴時(shí)铲汪,將依賴關(guān)系以key-value的形式保存到我們的dependencyManager的單例中去
3熊尉、category IOS中被依賴的對象UIVIew、UIViewController掌腰,當(dāng)被依賴對象釋放時(shí)狰住,dependencyManager講與之關(guān)聯(lián)的依賴控件或手勢、通知移除齿梁。