App 因服務(wù)端數(shù)據(jù)返回異常塑径、未實(shí)現(xiàn)方法等問題造成的crash比比皆是葡盗, 雖然有經(jīng)驗(yàn)的猿可以通過一些 if 判斷加層保護(hù)审磁,但是總覺得不夠優(yōu)雅;而且如果面對前猿留下的代碼呢... 顯然一個個加判斷有點(diǎn)力不從心...
在此問題的基礎(chǔ)上有幸看到了此作者的文章 ->戳這里 卢未,很全面的分析了造成crash的種種原因肪凛,在此不再啰嗦... 但是遺憾的是, 作者并未開源代碼 ...
基于以上情形辽社,本人的QYCrashProtector(崩潰保護(hù)工具)就誕生了N扒健!滴铅! 開源戳葵,但有不完善的地方,希望各位小伙伴看到后積極提出寶貴意見汉匙,讓我們共同努力拱烁,對crash say goodbye ~
在此感謝@ibireme!X洹戏自! 工具中的timer保護(hù)類,引用了 YYWeakProxy 類打破retainCycle.
(因 QYCrashProtector
庫中引入的YYWeakProxy
會和 YYKit
庫重名沖突, 特此把項(xiàng)目中引入的 YYWeakProxy
更名處理.)
使用方法:
可以在程序一啟動就在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中開啟crash保護(hù)伤锚;
當(dāng)然也可以在想要開啟的任意地方開啟擅笔, 早開早用;
開啟方法:
- Step 1:導(dǎo)入頭文件:
#import <QYCrashProtector.h>
; - Step 2:
[QYCrashProtector qy_openAllCrashProtector];
開啟所有類型保護(hù)。
注意事項(xiàng):
- 該工具的開放入口為
#import <QYCrashProtector.h>
猛们, 只需導(dǎo)入該頭文件就可使用所有功能念脯; - 類
QYCrashProtector.h
中有對應(yīng)的開啟保護(hù)類型的方法,可自行搭配阅懦; - 本工具主要采用了
method swizzling
的方式, 原工程不需要任何修改徘铝; - 目前支持 timer/ unrecognized selector/ NSArray/NSMutableArray/NSDictionary/NSMutableDictionary/NSCache / String系列/等保護(hù)耳胎;
- 因KVO、NSNotification惕它、BAD_ACCESS的保護(hù)方法存在一些問題怕午,暫未提供;
- 當(dāng)捕捉到異常時淹魄,會通過
QYErrorLog
類中的相關(guān)方法打印出來郁惜; - 每種類型的保護(hù)放在對應(yīng)的分類中,便于拓展維護(hù)甲锡。
詳情請查看源碼兆蕉。
Example:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// open all crash protector.
[QYCrashProtector qy_openAllCrashProtector];
// or:
// open unrecognized selector protector.
[QYCrashProtector qy_openCrashProtector_unrecognized_selector];
// open timer protector.
[QYCrashProtector qy_openCrashProtector_timer];
// open container protector.
[QYCrashProtector qy_openCrashProtector_container];
// open string protector.
[QYCrashProtector qy_openCrashProtector_string];
// open UI protector.
[QYCrashProtector qy_openCrashProtector_UI];
...
這個防止程序崩潰的庫支持Cocoapods。
pod 'QYCrashProtector'
源碼放在GitHub上了缤沦,想查看的小伙伴可以->戳這里虎韵。
千里之行,始于足下缸废。