防止了哪下崩潰: 一、UIControl依賴的target對象被釋放,UIControl繼續響應設置給target的selector函數致使的crashapp
二、UITableView依賴的delegate、datasource對象被釋放後,UITableView繼續響應delegate和datasource函數致使的crashide
三、UIScrollView依賴的delegate的對象被釋放後,UIScrollView繼續響應delegate函數致使的crash函數
四、UIPickView依賴的delegate、datasource對象被釋放後,UITableView繼續響應delegate和datasource函數致使的crash工具
五、UIGestureRecognizer依賴的target對象被釋放後,UIGestureRecognizer繼續響應設置給target的selector函數致使的cras h 六、NSNotificationCenter向已經被釋放的對象發送消息致使的crashspa
七、KVO的觀察者observer被釋放後value變化致使的crashserver
八、已釋放對象調用延遲操做致使的crash對象
九、NSTimer的target對象被釋放後,定時任務執行致使的crashget
十、添加KVO重複添加觀察者或重複移除觀察者(KVO註冊觀察者與移除觀察者不匹配)致使的crashit
實現的大體原理:io
一、建立dependencyManager單例管理依賴工具
二、category系統的有依賴屬性的對象,如:UIControl、UIScrollView、UITableView、UIPickerView、UIGestureRecognizer,NSTimer 在這些對象建立依賴時,將依賴關係以key-value的形式保存到咱們的dependencyManager的單例中去
三、category IOS中被依賴的對象UIVIew、UIViewController,當被依賴對象釋放時,dependencyManager講與之關聯的依賴控件或手勢、通知移除
示例工程使用說明:
一、在程序啓動時調用
[[VSDependencyManager shareInstance] start]
示例crash點:
scrol下移除customview後,button點擊、scrollview滾動、tap頁面空白處
table下移除customview後,tableview滾動、點擊、點擊noti按鈕發送通知
picker下移除customview後,pickerview滾動、點擊、點擊kvo改變value值,屢次移除kvo的觀察者
customview開啓延時函數,並強制釋放後,延時函數執行
customview開啓定時任務,並強制釋放後,定時任務執行
二、用戶加入本身操做防止crash VDMTest-Prefix.pch文件下 加入
註釋該行便可撤銷用戶本身操做
三、當程序不使用dependency管理工具,用戶本身也不進行依賴解除,crash點都會崩潰 當程序使用dependency管理工做或者用戶自行解除依賴,以上crash點均不會crash 因此用戶在自行處理的狀況下依然可使用dependency管理工做,操做不會有任何影響
其餘工程嵌入:(dependency工具包支持arc和非arc模式,不須要工程配置)
將VDM文件夾直接拖到新的工程中,複製並加入工程
引入頭文件
到APPDelegate.m文件
程序啓動時,啓動dependency單例
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [[VSDependencyManager shareInstance] start]; return YES;; }
使用方法 就是 加入頭文件 就OK了