如何防止unrecognized selector sent to instance 0xxx引起的崩潰問題

在開發(fā)中經(jīng)常遇到一種錯誤缩多,就是unrecognized selector sent to instance ***呆奕,這種類型的錯誤,說簡單點瞧壮,就是找不到這個類所對應(yīng)的方法登馒,這種情況通常是因為開發(fā)者的粗心,比如忘記了寫按鈕的方法實現(xiàn)咆槽,或者是服務(wù)器數(shù)據(jù)錯誤而引起的陈轿。
之前有人針對開發(fā)中常見的一些崩潰問題做過處理,但是僅限于數(shù)組越界秦忿,字典key值為空之類的常見錯誤麦射,比如
這個項目。但是針對未識別方法的崩潰處理灯谣,這個項目里是沒有的潜秋,所以我現(xiàn)在做的這個也算是對他的一種補(bǔ)充吧。
在demo中我們創(chuàng)建了一個紅色的btn

  [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];

但是并沒有實現(xiàn)click這個方法胎许,所以再點擊按鈕后峻呛,很自然的崩潰了。如下圖

錯誤信息.png

當(dāng)對崩潰方法進(jìn)行轉(zhuǎn)發(fā)處理后辜窑,就不會崩潰了钩述。而是會彈出一個彈框,告訴我們哪個類的什么方法沒有找到穆碎。在DEBUG模式中牙勘,也方便開發(fā)者調(diào)試。

下面是方法轉(zhuǎn)發(fā)的關(guān)鍵代碼:

#import "NSObject+UnRecognizedSelHandler.h"
#import <objc/runtime.h>

//提示框--->UIAlertController
#define ALERT_VIEW(Title,Message,Controller) {UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:nil];UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:Title message:Message preferredStyle:UIAlertControllerStyleAlert];        [alertVc addAction:action];[Controller presentViewController:alertVc animated:YES completion:nil];}

#import "AppDelegate.h"
static NSString *_errorFunctionName;
void dynamicMethodIMP(id self,SEL _cmd){
#ifdef DEBUG
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    UIViewController *currentRootViewController = delegate.window.rootViewController;
    NSString *error = [NSString stringWithFormat:@"errorClass->:%@\n errorFuction->%@\n errorReason->UnRecognized Selector",NSStringFromClass([self class]),_errorFunctionName];
    ALERT_VIEW(@"程序異常",error,currentRootViewController);
#else
    //upload error
    
#endif
    
}
#pragma mark 方法調(diào)換
static inline void change_method(Class _originalClass ,SEL _originalSel,Class _newClass ,SEL _newSel){
    Method methodOriginal = class_getInstanceMethod(_originalClass, _originalSel);
    Method methodNew = class_getInstanceMethod(_newClass, _newSel);
    method_exchangeImplementations(methodOriginal, methodNew);
}

@implementation NSObject (UnRecognizedSelHandler)
+ (void)load{
    
    change_method([self class], @selector(methodSignatureForSelector:), [self class], @selector(SH_methodSignatureForSelector:));
    
    change_method([self class], @selector(forwardInvocation:), [self class], @selector(SH_forwardInvocation:));
}

- (NSMethodSignature *)SH_methodSignatureForSelector:(SEL)aSelector{
    if (![self respondsToSelector:aSelector]) {
        _errorFunctionName = NSStringFromSelector(aSelector);
        NSMethodSignature *methodSignature = [self SH_methodSignatureForSelector:aSelector];
        if (class_addMethod([self class], aSelector, (IMP)dynamicMethodIMP, "v@:")) {
            NSLog(@"臨時方法添加成功所禀!");
        }
        if (!methodSignature) {
            methodSignature = [self SH_methodSignatureForSelector:aSelector];
        }
        
        return methodSignature;
        
    }else{
        return [self SH_methodSignatureForSelector:aSelector];
    }
}

- (void)SH_forwardInvocation:(NSInvocation *)anInvocation{
    SEL selector = [anInvocation selector];
    if ([self respondsToSelector:selector]) {
        [anInvocation invokeWithTarget:self];
    }else{
        [self SH_forwardInvocation:anInvocation];
    }
}
@end

原理就是運用oc的運行時方面,將系統(tǒng)的轉(zhuǎn)發(fā)方法與自己的方法做替換,從而為這個對象重新綁定一個新的方法色徘,新的方法會在當(dāng)前頁面彈出程序的錯誤信息恭金。也可以在這里將錯誤的代碼信息上傳到自己的服務(wù)器中。效果如下:

捕獲到的崩潰信息.png

最后可以點擊這里下載demo褂策。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔚叨,一起剝皮案震驚了整個濱河市床蜘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔑水,老刑警劉巖邢锯,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笤喳,死亡現(xiàn)場離奇詭異窥淆,居然都是意外死亡晒来,警方通過查閱死者的電腦和手機(jī)蓬痒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門伐坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來派草,“玉大人贝润,你說我怎么就攤上這事奠伪“裆唬” “怎么了护戳?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垂睬。 經(jīng)常有香客問我媳荒,道長,這世上最難降的妖魔是什么驹饺? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任钳枕,我火速辦了婚禮,結(jié)果婚禮上赏壹,老公的妹妹穿的比我還像新娘鱼炒。我一直安慰自己,他們只是感情好蝌借,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布昔瞧。 她就那樣靜靜地躺著,像睡著了一般菩佑。 火紅的嫁衣襯著肌膚如雪自晰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天擎鸠,我揣著相機(jī)與錄音,去河邊找鬼缘圈。 笑死劣光,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糟把。 我是一名探鬼主播绢涡,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遣疯!你這毒婦竟也來了雄可?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎数苫,沒想到半個月后聪舒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡虐急,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年箱残,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止吁。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡被辑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敬惦,到底是詐尸還是另有隱情盼理,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布俄删,位于F島的核電站宏怔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抗蠢。R本人自食惡果不足惜举哟,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅矛。 院中可真熱鬧妨猩,春花似錦、人聲如沸秽褒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽销斟。三九已至庐椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚂踊,已是汗流浹背约谈。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留犁钟,地道東北人棱诱。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像涝动,于是被迫代替她去往敵國和親迈勋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容