從method swizzling 到crash 分析與解決

引文

之前開發(fā)中了解到Android遇到Crash觉既,可以利用框架回退到上一個頁面而不是閃退掉惧盹,然后在思考如何降低iOS的Crash率,當然最主要方法是從根源抓起瞪讼,注意代碼邏輯完成性钧椰,代碼規(guī)范性,多測試符欠。

后來知道可以通過Runtime的方法交換替換一些方法嫡霞,那么此時就可以替換掉NSArray、NSDictionary的一些插入方法希柿,進行判斷避免插入空值诊沪。

通過本文你可以學(xué)到什么?

  1. 簡單的方法交換和消息轉(zhuǎn)發(fā)降低crash率
  2. 遇到crash怎么快速定位與解決

1. 簡單的方法交換和消息轉(zhuǎn)發(fā)降低crash率

先說一些一眼能定位的異常曾撤,數(shù)組越界端姚、插入空值等,我們可以使用分類進行交換系統(tǒng)方法避免Crash挤悉,原理很簡單渐裸,見代碼:

@implementation NSArray (XQAdd)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    [objc_getClass("__NSArrayI") swizzleInstanceMethod:@selector(objectAtIndex:) with:@selector(xq_objectAtIndex:)];
        // [@"1"]
}

- (id)xq_objectAtIndex:(NSInteger)index {
    if (index >= self.count || index < 0 || !self.count) {
        return nil;
    }
    return [self xq_objectAtIndex:index];
}

同樣,我們也可以交換NSMutableArray的插入方法,NSDictionary的插入方法等昏鹃,可以看我寫的一個代碼示例

還有在我們獲取到網(wǎng)絡(luò)數(shù)據(jù)的時候尚氛,如果直接當字典取值,并不知道某個key存儲的值是NSNumber還是NSString洞渤,但是我的習(xí)慣性是傳值大部分使用NSString來進行怠褐,所以遇到NSNumber當NSString使用可能會發(fā)生崩潰,那么我們利用消息轉(zhuǎn)發(fā)-forwardingTargetForSelector:實現(xiàn)NSNumber直接當做NSString使用不崩潰您宪。主要代碼如下

@implementation NSNumber (avoidCrash)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleInstanceMethod:@selector(respondsToSelector:) with:@selector(swizzle_respondsToSelector:)];
        [self swizzleInstanceMethod:@selector(forwardingTargetForSelector:) with:@selector(swizzle_forwardingTargetForSelector:)];
    });
}
- (BOOL)swizzle_respondsToSelector:(SEL)aSelector {
    if ([self swizzle_respondsToSelector:aSelector]) {
        return YES;
    }
    if ([__checkString respondsToSelector:aSelector]) {
        return YES;
    }
    return [super respondsToSelector:aSelector];
}

- (id)swizzle_forwardingTargetForSelector:(SEL)aSelector {
    // whether NSString respondsToSelector
    if ([__checkString respondsToSelector:aSelector]) {
        return [NSString stringWithFormat:@"%@", self];
    }
    // Returns the object to which unrecognized messages should first be directed
    return [super forwardingTargetForSelector:aSelector];
}

其實Runtime類似于跑酷,玩不好就會摔的很慘奠涌,斟酌使用此方法宪巨,最好的方式就是寫好自己的代碼邏輯。

2. 遇到crash怎么快速定位與解決

這里推薦一篇文章@念茜漫談iOS Crash收集框架, 推薦閱讀

補充一些大家常見的EXC_BAD_錯誤原因

1)EXC_BAD_ACCESS
此類型的Excpetion是我們最長碰到的Crash溜畅,通常用于訪問了不改訪問的內(nèi)存導(dǎo)致捏卓。一般EXC_BAD_ACCESS后面的"()"還會帶有補充信息。

SIGSEGV:通常由于重復(fù)釋放對象導(dǎo)致慈格,這種類型在切換了ARC以后應(yīng)該已經(jīng)很少見到了怠晴。

SIGABRT:收到Abort信號退出,通常Foundation庫中的容器為了保護狀態(tài)正常會做一些檢測浴捆,例如插入nil到數(shù)組中等會遇到此類錯誤蒜田。

SEGV:(Segmentation Violation),代表無效內(nèi)存地址选泻,比如空指針冲粤,未初始化指針,棧溢出等页眯;

SIGBUS:總線錯誤梯捕,與 SIGSEGV 不同的是,SIGSEGV 訪問的是無效地址窝撵,而 SIGBUS 訪問的是有效地址傀顾,但總線訪問異常(如地址對齊問題)

SIGILL:嘗試執(zhí)行非法的指令,可能不被識別或者沒有權(quán)限

2)EXC_BAD_INSTRUCTION
此類異常通常由于線程執(zhí)行非法指令導(dǎo)致碌奉。

1.在代碼中修改了storyboard與outlet的對應(yīng)關(guān)系短曾,但是storyboard沒有更新時發(fā)生過此crash。

2.與第三方庫中方法沖突時發(fā)生過此crash道批。

3.調(diào)用系統(tǒng)方法時傳入了不恰當?shù)闹羔橆愋汀?/p>

3)EXC_ARITHMETIC
代碼中做除法時分母為零了會發(fā)生此問題错英。

推薦兩個開源的Crash 收集庫

plcrashreporter:這是是相對比較早的Crash收集處理庫了,支付寶的開源協(xié)議上就有此庫隆豹。使用的話大致流程就是椭岩,注冊到APP,搜集Crash文件、上傳判哥。
更推薦KSCrash献雅,這個維護更新的比較多,可以了解一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塌计,一起剝皮案震驚了整個濱河市挺身,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锌仅,老刑警劉巖章钾,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異热芹,居然都是意外死亡贱傀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門伊脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來府寒,“玉大人,你說我怎么就攤上這事报腔≈晟Γ” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵纯蛾,是天一觀的道長纤房。 經(jīng)常有香客問我,道長茅撞,這世上最難降的妖魔是什么帆卓? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮米丘,結(jié)果婚禮上剑令,老公的妹妹穿的比我還像新娘。我一直安慰自己拄查,他們只是感情好吁津,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布读第。 她就那樣靜靜地躺著距误,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卖擅。 梳的紋絲不亂的頭發(fā)上稍算,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天典尾,我揣著相機與錄音,去河邊找鬼糊探。 笑死钾埂,一個胖子當著我的面吹牛河闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褥紫,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼姜性,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了髓考?” 一聲冷哼從身側(cè)響起部念,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氨菇,沒想到半個月后儡炼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡查蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年射赛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奶是。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竣灌,靈堂內(nèi)的尸體忽然破棺而出聂沙,到底是詐尸還是另有隱情,我是刑警寧澤初嘹,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布及汉,位于F島的核電站,受9級特大地震影響屯烦,放射性物質(zhì)發(fā)生泄漏坷随。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一驻龟、第九天 我趴在偏房一處隱蔽的房頂上張望温眉。 院中可真熱鬧,春花似錦翁狐、人聲如沸类溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯冷。三九已至,卻和暖如春懈词,著一層夾襖步出監(jiān)牢的瞬間蛇耀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工坎弯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纺涤,地道東北人译暂。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像洒琢,于是被迫代替她去往敵國和親秧秉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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